| ((r => o0 * P))(H0), P0(H), rely(me, O1, (H0 ∪ H)[r, o1], O2, H2), H0 ⊥ H, ∀ r. r ∈ H0 → O2(r) = me ⊦ ((!(me, O2, r => o1 * P) * P0))((H0 ∪ H)[r, o1]) |
⊦ r ∈ H0 ∧ H0 ⊥ H1 → (H0 ∪ H1)[r, o] = H0[r, o] ∪ H1
((r => o0 * P))(H0), P0(H), rely(me, O1, H0[r, o1] ∪ H, O2, H2), r ∈ H0, H0 ⊥ H, ∀ r. r ∈ H0 → O2(r) = me ⊦ ((!(me, O2, r => o1 * P) * P0))(H0[r, o1] ∪ H)
Used simplifier rules: sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep% ⊦ ((r => o * P))(H) → r ∈ H; (s) Used terms: o1, r, H, H0