| P(H0), P0(H), oP(o)(H2), H2 ⊥ H, H0 ⊥ H2, H0 ⊥ H, ∀ r. r ∈ H2 ∨ r ∈ H → O(r) = me ⊦ ((!(me, O, oP(o) * P0) * P))((H2 ∪ H) ∪ H0), ∃ o. ((!(me, O, oP(o) * P0) * P))((H2 ∪ H) ∪ H0), ((oP(o) * P0))(H2 ∪ H) ∧ (∀ r. r ∈ H2 ∪ H → O(r) = me) |
P(H0), P0(H), oP(o)(H2), H0 ⊥ H, H0 ⊥ H2, H2 ⊥ H, ∀ r. r ∈ H2 ∨ r ∈ H → O(r) = me, r ∈ H2 ∨ r ∈ H ⊦ O(r) = me, ((!(me, O, oP(o) * P0) * P))((H2 ∪ H) ∪ H0), ∃ o. ((!(me, O, oP(o) * P0) * P))((H2 ∪ H) ∪ H0)
Used simplifier rules: ⊦ H0 ⊥ H1 → (r ∈ H0 ∪ H1 ↔ r ∈ H0 ∨ r ∈ H1); (s)%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep% ⊦ P0(H0) ∧ P1(H1) ∧ H0 ⊥ H1 → ((P0 * P1))(H0 ∪ H1); (ss)