| H0 ⊥ H1, ∃ H0, o. H1 = (H0 ++ r0)[r0, o] ∧ ¬ r0 ∈ H0, ∀ H, H0, r. # H < # H1 → H0 ⊥ H → (r ∈ H0 ∪ H ↔ r ∈ H0 ∨ r ∈ H) ⊦ r ∈ H0 ∪ H1 ↔ r ∈ H0 ∨ r ∈ H1, r0 = null |
H0 ⊥ H, ∀ H2, H0, r. # H2 < # (H ++ r0)[r0, o] → H0 ⊥ H2 → (r ∈ H0 ∪ H2 ↔ r ∈ H0 ∨ r ∈ H2) ⊦ r ∈ (H0 ∪ H) ++ r0 ↔ r ∈ H0 ∨ r = r0 ∨ r ∈ H, r0 = null, r0 ∈ H, r0 ∈ H0
Used simplifier rules: in-alloc: r0 ≠ null, ¬ r0 ∈ H ⊦ r ∈ H ++ r0 ↔ r = r0 ∨ r ∈ H;%disj-write: r ≠ null, ¬ r ∈ H1 ⊦ H0 ⊥ (H1 ++ r)[r, o] ↔ H0 ⊥ H1 ∧ ¬ r ∈ H0;%disj-alloc: r0 ≠ null, ¬ r0 ∈ H0, ¬ r0 ∈ H1 ⊦ H0 ⊥ H1 → H0 ⊥ H1 ++ r0;%uni-write: r ≠ null, r ∈ H1, H0 ⊥ H1 ⊦ H0 ∪ H1[r, o] = (H0 ∪ H1)[r, o];%in-write: ⊦ r ∈ H[r0, o] ↔ r ∈ H;%uni-alloc: r ≠ null, ¬ r ∈ H1, ¬ r ∈ H0, H0 ⊥ H1 ⊦ H0 ∪ (H1 ++ r) = (H0 ∪ H1) ++ r;