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