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