| H1 ++ r = H0 ∪ H4 ∪ H3, r =>_ = !(me, O2, r =>_), !(me, O1, P)(H4), r =>_(H0), P0(H3), rely(me, O1(r; me), H0 ∪ H4 ∪ H3, O2, H2), H4 ⊥ H3, H0 ⊥ H4, H0 ⊥ H3 ⊦ r = null, ((!(me, O2, r =>_) * !(me, O2, P) * P0))(H0 ∪ H4 ∪ H3), r ∈ H1, !(me, O2, r =>_)(H0) ∧ ((!(me, O2, P) * P0))(H4 ∪ H3) ∧ H0 ⊥ H4 ∪ H3 |
H1 ++ r = H0 ∪ H4 ∪ H3, r =>_ = !(me, O2, r =>_), !(me, O1, P)(H4), r =>_(H0), P0(H3), rely(me, O1(r; me), H1 ++ r, O2, H2), H4 ⊥ H3, H0 ⊥ H4, H0 ⊥ H3 ⊦ r = null, ((!(me, O2, P * r =>_) * P0))(H1 ++ r), ((!(me, O2, P) * P0))(H4 ∪ H3), r ∈ H1
Used simplifier rules: compact-local: ⊦ !(me, O, P0) * !(me, O, P1) = !(me, O, P0 * P1);% ⊦ H1 ⊥ H → (H0 ⊥ H1 ∪ H ↔ H0 ⊥ H1 ∧ H0 ⊥ H); (ws)%sep-com: ⊦ P0 * P1 = P1 * P0; from specification heap-sep%sep-ass: ⊦ (P0 * P1) * P2 = P0 * P1 * P2; from specification heap-sep