| # 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] |
# ax1 = # kx1, # ax0 = # kx, range ri ∩ ax0.toSet = ∅, range ri ∩ ax1.toSet = ∅, ri-inj(ri), ∀ 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] ⊦ (ax1 + adr ' + ax0)[# kx1] = adr, key1 = key0, dups(ax1 + ax0), dups(ax1), dups(ax0), adr ∈ ri, (ax1 + adr ' + ax0)[# kx1] ∈ ax0, (ax1 + adr ' + ax0)[# kx1] ∈ ax1, (ax1 + adr ' + ax0)[# kx1] ∈ ri, key0 ∈ kx, adr ∈ ax0, adr ∈ ax1, key1 ∈ ri ∧ key0 ∈ ri ∧ ri[key1] = ri[key0]
Used simplifier rules: a: ⊦ ¬ dups(ax + ax0) → ¬ dups(ax) ∧ ¬ dups(ax0); (forward) from specification list-dup[address-list-set]% ⊦ dups(ax + adr ' + ax0) ↔ adr ∈ ax ∨ adr ∈ ax0 ∨ dups(ax + ax0); (ws)% ⊦ dups(adr ' + ax) ↔ dups(ax) ∨ adr ∈ ax; (ws)% ⊦ adr ∈ adr0 ' + ax ↔ ¬(adr ≠ adr0 ∧ ¬ adr ∈ ax); (ss)% ⊦ key ∈ ri[key, adr]; (s)% ⊦ # kx = # ax → (key ∈ ri[kx, ax] ↔ key ∈ ri ∨ key ∈ kx); (ws)%a: ⊦ (kx + kx0) + kx1 = kx + kx0 + kx1; from specification list[key-list-set]% ⊦ ri[key ' + kx, adr ' + ax] = ri[key, adr][kx, ax]; (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)% ⊦ m +1 = m + 1; (s)% ⊦ #(adr ' + ax) = (# ax)+1; (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)% ⊦ adr + ax = adr ' + ax; (s)