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