| # kx = # ax, ax.toSet ∩ range ri = ∅, ri-inj(ri), kx.toSet ⊆ dom ri, ∀ kx0, ax, ri. # kx0 < # kx → # kx0 = # ax ∧ ax.toSet ∩ range ri = ∅ ∧ ri-inj(ri) ∧ kx0.toSet ⊆ dom ri → range ri[kx0, ax] = (range ri \ ri[kx0].toSet) ∪ ax.toSet ∨ dups(kx0) ∨ dups(ax) ⊦ range ri[kx, ax] = (range ri \ ri[kx].toSet) ∪ ax.toSet, dups(ax), dups(kx), ∀ kx0, key. kx ≠ kx0 + key ' |
# kx0 + 1 = # ax, ax.toSet ∩ range ri = ∅, ri-inj(ri), key ∈ ri, kx0.toSet ⊆ dom ri, ∀ kx1, ax, ri. # kx1 < #(kx0 + key ') → # kx1 = # ax ∧ ax.toSet ∩ range ri = ∅ ∧ ri-inj(ri) ∧ kx1.toSet ⊆ dom ri → range ri[kx1, ax] = (range ri \ ri[kx1].toSet) ∪ ax.toSet ∨ dups(kx1) ∨ dups(ax) ⊦ range ri[kx0 + key ', ax] = ((range ri \ ri[kx0].toSet) -- ri[key]) ∪ ax.toSet, dups(ax), dups(kx0), key ∈ kx0
Used simplifier rules: ⊦ dups(kx + key ') ↔ key ∈ kx ∨ dups(kx); (ws)% ⊦ key ∈ dom ri ↔ key ∈ ri; (s)% ⊦ ks ++ key ⊆ ks0 ↔ ks ⊆ ks0 ∧ key ∈ ks0; (ws)%unc: ⊦ ks ∪ ks0 = ks0 ∪ ks; from specification set-union[node-index]%una: ⊦ (ks ∪ ks0) ∪ ks1 = ks ∪ ks0 ∪ ks1; from specification set-union[node-index]% ⊦ ks ∪ ∅ = ks; (s)% ⊦ (ks ++ key) ∪ ks0 = (ks ∪ ks0) ++ key; (s)% ⊦ key '.toSet = ∅ ++ key; (s)% ⊦ (kx + kx0).toSet = kx.toSet ∪ kx0.toSet; (s)% ⊦ as \ (as0 ++ adr) = (as \ as0) -- adr; (s)%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]%unc: ⊦ as ∪ as0 = as0 ∪ as; from specification set-union[node-store]%una: ⊦ (as ∪ as0) ∪ as1 = as ∪ as0 ∪ as1; from specification set-union[node-store]% ⊦ as ∪ ∅ = as; (s)% ⊦ (as ++ adr) ∪ as0 = (as ∪ as0) ++ adr; (s)% ⊦ adr '.toSet = ∅ ++ adr; (s)% ⊦ (ax + ax0).toSet = ax.toSet ∪ ax0.toSet; (s)% ⊦ ri[key '] = ri[key] '; (s)% ⊦ ri[kx0 + kx1] = ri[kx0] + ri[kx1]; (s)%a: ⊦ (kx + kx0) + kx1 = kx + kx0 + kx1; from specification list[key-list-set]% ⊦ # key ' = 0 +1; (s)% ⊦ #(kx + kx0) = # kx + # kx0; (s)