| H0 ⊥ H1, ∃ H0, o. H1 = (H0 ++ r)[r, o] ∧ ¬ r ∈ H0, ∀ H, H0. # H < # H1 → H0 ⊥ H → #(H0 ∪ H) = # H0 + # H ⊦ #(H0 ∪ H1) = # H0 + # H1, r = null |
H0 ⊥ H, ∀ H2, H0. # H2 < # (H ++ r)[r, o] → H0 ⊥ H2 → #(H0 ∪ H2) = # H0 + # H2 ⊦ #(H0 ∪ H) = # H0 + # H, r = null, r ∈ H, r ∈ 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];%size-write: r ∈ H ⊦ # H[r, o] = # H;%size-alloc: ¬ r ∈ H, r ≠ null ⊦ #(H ++ r) = # H + 1;%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);%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ m + n = m + n0 ↔ n = n0; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic