| # kx0 = # ax0, range ri ∩ ax0.toSet = ∅, 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, ax0][key, adr] = (ax0.toSet ∪ ((range ri \ ri[kx0].toSet) -- ri[key])) ++ adr, dups(kx0), dups(ax0), adr ∈ ri, key ∈ kx0, adr ∈ ax0 |
⊦ key ∈ ri ∧ ri-inj(ri) → range ri[key, adr] = (range ri -- ri[key]) ++ adr
# kx0 = # ax0, range ri ∩ ax0.toSet = ∅, ri-inj(ri), ri-inj(ri[kx0, ax0]), key ∈ ri, key ∈ ri[kx0, ax0], 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, ax0] -- ri[kx0, ax0][key]) ++ adr = (ax0.toSet ∪ ((range ri \ ri[kx0].toSet) -- ri[key])) ++ adr, dups(ax0), dups(kx0), adr ∈ ax0, key ∈ kx0, adr ∈ ri
Used simplifier rules: ri-inj-index-update: # ax = # kx ⊦ ri-inj(ri) ∧ ¬ dups(ax) ∧ ax.toSet ∩ range ri = ∅ → ri-inj(ri[kx, ax]);%int-a: ⊦ (as ∩ as0) ∩ as1 = as ∩ as0 ∩ as1; from specification set-union[node-store]%int-c: ⊦ as ∩ as0 = as0 ∩ as; from specification set-union[node-store]% ⊦ # kx = # ax → (key ∈ ri[kx, ax] ↔ key ∈ ri ∨ key ∈ kx); (ws) Used terms: adr, key, ri[kx0, ax0]