| # ax1 = # kx1, # ax = # kx + 1, range ri ∩ ax.toSet = ∅, range ri ∩ ax1.toSet = ∅, ri-inj(ri), key0 ∈ ri[kx1, ax1][key0 ' + kx, ax], ∀ kx2, ax, ri, key, key2. # kx2 < #((kx1 + key0 ' + kx) + key1 ') → # ax = # kx2 ∧ ri[kx2, ax][key] = ri[kx2, ax][key2] ∧ ax.toSet ∩ range ri = ∅ ∧ ri-inj(ri) ∧ key ∈ ri[kx2, ax] ∧ key2 ∈ ri[kx2, ax] → key = key2 ∨ dups(ax) ∨ key ∈ ri ∧ key2 ∈ ri ∧ ri[key] = ri[key2] ⊦ key1 = key0, dups(ax), dups(ax1), dups(ax1 + ax), (ax1 + ax)[# kx1] ∈ ax, (ax1 + ax)[# kx1] ∈ ax1, (ax1 + ax)[# kx1] ∈ ri, key0 ∈ kx, key1 ∈ ri ∧ key0 ∈ ri ∧ ri[key1] = ri[key0] |
# ax = # kx + 1, # ax1 = # kx1, ax = adr + ax0, range ri ∩ ax1.toSet = ∅, range ri ∩ ax.toSet = ∅, ri-inj(ri), key0 ∈ ri[kx1, ax1][key0 ' + kx, ax], ∀ kx2, ax, ri, key, key2. # kx2 < #((kx1 + key0 ' + kx) + key1 ') → # ax = # kx2 ∧ ri[kx2, ax][key] = ri[kx2, ax][key2] ∧ ax.toSet ∩ range ri = ∅ ∧ ri-inj(ri) ∧ key ∈ ri[kx2, ax] ∧ key2 ∈ ri[kx2, ax] → key = key2 ∨ dups(ax) ∨ key ∈ ri ∧ key2 ∈ ri ∧ ri[key] = ri[key2] ⊦ key1 = key0, dups(ax1 + ax), dups(ax1), dups(ax), key0 ∈ kx, (ax1 + ax)[# kx1] ∈ ri, (ax1 + ax)[# kx1] ∈ ax1, (ax1 + ax)[# kx1] ∈ ax, key1 ∈ ri ∧ key0 ∈ ri ∧ ri[key1] = ri[key0]
Used simplifier rules: address-list freely generated by [], +;;% ⊦ [].toSet = ∅; (s)% ⊦ as ∩ ∅ = ∅; (s)%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]% ⊦ # [] = 0; (s)% ⊦ m + n = 0 ↔ m = 0 ∧ n = 0; (ws)% ⊦ # kx = 0 ↔ kx = []; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic