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