| # ax = # kx0 + 1, ri[kx0 + key1 ', ax][key] = ri[kx0 + key1 ', ax][key0], ax.toSet ∩ range ri = ∅, ri-inj(ri), key ∈ ri[kx0 + key1 ', ax], key0 ∈ ri[kx0 + key1 ', ax], ∀ kx1, ax, ri, key, key0. # kx1 < #(kx0 + key1 ') → # ax = # kx1 ∧ ri[kx1, ax][key] = ri[kx1, ax][key0] ∧ ax.toSet ∩ range ri = ∅ ∧ ri-inj(ri) ∧ key ∈ ri[kx1, ax] ∧ key0 ∈ ri[kx1, ax] → key = key0 ∨ dups(ax) ∨ key ∈ ri ∧ key0 ∈ ri ∧ ri[key] = ri[key0] ⊦ key = key0, dups(ax), ∀ ax0, adr. ax ≠ ax0 + adr ', key ∈ ri ∧ key0 ∈ ri ∧ ri[key] = ri[key0] |
# ax0 = # kx0, ri[kx0, ax0][key1, adr][key] = ri[kx0, ax0][key1, adr][key0], range ri ∩ ax0.toSet = ∅, ri-inj(ri), key0 ∈ ri[kx0, ax0][key1, adr], key ∈ ri[kx0, ax0][key1, adr], ∀ kx1, ax, ri, key, key0. # kx1 < #(kx0 + key1 ') → # ax = # kx1 ∧ ri[kx1, ax][key] = ri[kx1, ax][key0] ∧ ax.toSet ∩ range ri = ∅ ∧ ri-inj(ri) ∧ key ∈ ri[kx1, ax] ∧ key0 ∈ ri[kx1, ax] → key = key0 ∨ dups(ax) ∨ key ∈ ri ∧ key0 ∈ ri ∧ ri[key] = ri[key0] ⊦ key = key0, dups(ax0), adr ∈ ri, adr ∈ ax0, key ∈ ri ∧ key0 ∈ ri ∧ ri[key] = ri[key0]
Used simplifier rules: ⊦ dups(ax + adr ') ↔ adr ∈ ax ∨ dups(ax); (ws)%a: ⊦ (kx + kx0) + kx1 = kx + kx0 + kx1; from specification list[key-list-set]%# kx = # ax ⊦ ri[kx + key ', ax + adr '] = ri[kx, ax][key, adr]; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + n = m + n0 ↔ n = n0; (s)% ⊦ # adr ' = 0 +1; (s)% ⊦ #(ax + ax0) = # ax + # ax0; (s)%int-c: ⊦ as ∩ as0 = as0 ∩ as; from specification set-union[node-store]%int-a: ⊦ (as ∩ as0) ∩ as1 = as ∩ as0 ∩ as1; from specification set-union[node-store]% ⊦ adr ∈ range ri ↔ adr ∈ ri; (s)% ⊦ as ∩ (as0 ++ adr) = ∅ ↔ as ∩ as0 = ∅ ∧ ¬ adr ∈ as; (ws)%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)