| n < m, n < # asar, disj(asar, 0, m), m ≤ # asar ⊦ union(asar[n, as], 0, m) = (union(asar, 0, m) \ asar[n]) ∪ as |
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
Used simplifier rules: union-write-above: m ≤ # asar, m ≤ n ⊦ union(asar[n, as], 0, m) = union(asar, 0, m);%union-base: ⊦ union(asar, n, 0) = ∅;%nat freely generated by 0, +1;;% ⊦ 0 ≤ m; (s)% ⊦ ∅ \ as = ∅; (s)% ⊦ as ∪ ∅ = as; (s)%una: ⊦ (as ∪ as0) ∪ as1 = as ∪ as0 ∪ as1; from specification set-union[address-list-set]%unc: ⊦ as ∪ as0 = as0 ∪ as; from specification set-union[address-list-set]% ⊦ ¬ m < 0; (s)