| adr ∈ union(asar, n, m0) ↔ (∃ n0. n ≤ n0 ∧ n0 < n + m0 ∧ adr ∈ asar[n0]), ∃ n0. n ≤ n0 ∧ ¬ n + m0 < n0 ∧ adr ∈ asar[n0] ⊦ adr ∈ asar[n + m0] ∪ union(asar, n, m0) |
adr ∈ asar[n0], n0 ≤ n + m0, n ≤ n0 ⊦ # asar[n0] = 0, asar[n0] = ∅, adr ∈ union(asar, n, m0), adr ∈ asar[n + m0], ∃ n0. n ≤ n0 ∧ n0 < n + m0 ∧ adr ∈ asar[n0]
Used simplifier rules: size-zero-01: ⊦ as ≠ ∅ → # as ≠ 0; (forward) from specification set-basic[address-list-set]%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m ≤ m + n; (s)%let: ⊦ n ≤ n0 ∧ n0 ≤ n1 → n ≤ n1; (forward) from specification nat%ne-01: ⊦ adr ∈ as → as ≠ ∅; (forward) from specification set-basic[address-list-set]% ⊦ m < n ↔ ¬ n ≤ m; (ss)%unc: ⊦ as ∪ as0 = as0 ∪ as; from specification set-union[address-list-set]%una: ⊦ (as ∪ as0) ∪ as1 = as ∪ as0 ∪ as1; from specification set-union[address-list-set]% ⊦ adr ∈ as ∪ as0 ↔ ¬(¬ adr ∈ as ∧ ¬ adr ∈ as0); (ss)