| H2 ∪ H0 = H1 ∪ H, ls(r, x)(H2), ls(r, x)(H1), H2 ⊥ H0, H1 ⊥ H ⊦ H2 = H1 |
H2 ∪ H0 = H1 ∪ H, ls(r, a + x0)(H1), ls(r, a + x0)(H2), H1 ⊥ H, H2 ⊥ H0, ∀ H2, H0, H1, H, r. H2 ∪ H0 = H1 ∪ H ∧ ls(r, x0)(H2) ∧ ls(r, x0)(H1) ∧ H2 ⊥ H0 ∧ H1 ⊥ H → H2 = H1 ⊦ H2 = H1
Used simplifier rules: ls-base: ⊦ ls(r, []) = (emp ∧ ⌜r = null⌝ );%list freely generated by [], +;;% ⊦ ((P0 ∧ P1))(H) ↔ P0(H) ∧ P1(H); (s)% ⊦ emp(H) ↔ H = ∅; (s)% ⊦ ⌜bv⌝ (H) ↔ bv; (s)%and-ass: ⊦ ((P0 ∧ P1) ∧ P2) = (P0 ∧ P1 ∧ P2); from specification heap-sep%and-com: ⊦ (P0 ∧ P1) = (P1 ∧ P0); from specification heap-sep% ⊦ ⌜true⌝ = true; (s)% ⊦ (true ∧ P) = P; (s)% ⊦ precise(emp); (s)%precise(P) ⊦ P(H0) ∧ P(H1) ∧ H0 ⊥ H ∧ H1 ⊥ H2 → (H0 ∪ H = H1 ∪ H2 ↔ H0 = H1 ∧ H = H2); (s)