| m0 < # asar, n < # asar, disj(asar, 0, m0 + 1), n ≤ m0, ∀ n, asar, as. n < m0 ∧ n < # asar ∧ disj(asar, 0, m0) ∧ m0 ≤ # asar → union(asar[n, as], 0, m0) = (union(asar, 0, m0) \ asar[n]) ∪ as ⊦ m0 = n, asar[n, as][m0] ∪ union(asar[n, as], 0, m0) = ((asar[m0] ∪ union(asar, 0, m0)) \ asar[n]) ∪ as |
n < m0, m0 < # asar, n < # asar, n + 1 < # asar, disj(asar, 0, m0 + 1), ∀ n, asar, as. n < m0 ∧ n < # asar ∧ disj(asar, 0, m0) ∧ m0 ≤ # asar → union(asar[n, as], 0, m0) = (union(asar, 0, m0) \ asar[n]) ∪ as ⊦ m0 = n, asar[m0] ∪ union(asar[n, as], 0, m0) = (asar[m0] ∪ (union(asar, 0, m0) \ asar[n])) ∪ as
Used simplifier rules: disj-union-rem: m ≤ # asar, n0 ≠ n1, n0 < m, n1 < m ⊦ disj(asar, 0, m) → (asar[n0] ∪ as) \ asar[n1] = asar[n0] ∪ (as \ asar[n1]);% ⊦ m +1 = m + 1; (s)% ⊦ m < n → n ≠ 0; (s)%lf: ⊦ m < n ∧ n < n0 → m +1 < n0; (forward) from specification nat-basic%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%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]% ⊦ m < n → ¬ n < m; (s)% ⊦ m ≠ n → (m < n ↔ ¬ n < m); (ss)% ⊦ m ≠ n → (m ≤ n ↔ m < n); (s)% ⊦ m ≠ n → (m < n + 1 ↔ m < n); (s)% ⊦ ¬ n < n; (s)% ⊦ m < n + 1 ↔ ¬ n < m; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + 1 ≤ n ↔ m < n; (s)% ⊦ m ≠ n → asar[n, a0][m] = asar[m]; (s)