| H0 ⊥ H1, ∃ H0, o. H1 = (H0 ++ r0)[r0, o] ∧ ¬ r0 ∈ H0, r ∈ H0 ∨ r ∈ H1, ∀ H, H0, r. # H < # H1 → H0 ⊥ H ∧ (r ∈ H0 ∨ r ∈ H) → (H0 ∪ H)[r] = (r ∈ H0 ⊃ H0[r];H[r]) ⊦ (H0 ∪ H1)[r] = (r ∈ H0 ⊃ H0[r];H1[r]), r0 = null |
H0 ⊥ H, r ∈ H ∨ r ∈ H0, ∀ H2, H0, r. # H2 < # (H ++ r0)[r0, o] → H0 ⊥ H2 ∧ (r ∈ H0 ∨ r ∈ H2) → (H0 ∪ H2)[r] = (r ∈ H0 ⊃ H0[r];H2[r]) ⊦ ((H0 ∪ H) ++ r0)[r] = (r ∈ H0 ⊃ H0[r];(H ++ r0)[r]), r = r0, r0 = null, r0 ∈ H0, r0 ∈ H
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];%at-write: ⊦ H[r0, o][r] = (r = r0 ∧ r0 ∈ H ⊃ o;H[r]);%uni-alloc: r ≠ null, ¬ r ∈ H1, ¬ r ∈ H0, H0 ⊥ H1 ⊦ H0 ∪ (H1 ++ r) = (H0 ∪ H1) ++ r;%in-uni: ⊦ H0 ⊥ H1 → (r ∈ H0 ∪ H1 ↔ r ∈ H0 ∨ r ∈ H1);%in-write: ⊦ r ∈ H[r0, o] ↔ r ∈ H;