| # kx = # ax, new(ax, fs), key ∈ ri, kx.toSet ⊆ dom ri, ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]), ∃ kx0, kx1. kx = kx0 + (key + kx1) ⊦ dups(ax), dups(kx), (ri[kx, ax][key] ∈ fs ∨ ri[kx, ax][key] ∈ ax) ∧ key-cons(key, fs[ax, fs[ri[kx]]][ri[kx, ax][key]]) |
# kx1 + # kx0 + 1 = # ax, new(ax, fs), key ∈ ri, kx0.toSet ⊆ dom ri, kx1.toSet ⊆ dom ri, ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]) ⊦ dups(ax), dups(kx1 + kx0), dups(kx1), dups(kx0), key ∈ kx1, key ∈ kx0, (ax[# kx1] ∈ fs ∨ ax[# kx1] ∈ ax) ∧ key-cons(key, fs[ax, fs[ri[kx1]] + fs[ri[key]] ' + fs[ri[kx0]]][ax[# kx1]])
Used simplifier rules: a: ⊦ ¬ dups(kx + kx0) → ¬ dups(kx) ∧ ¬ dups(kx0); (forward) from specification list-dup[key-list-set]%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]% ⊦ nd + ndx = nd ' + ndx; (s)% ⊦ fs[adr ' + ax] = fs[adr] + fs[ax]; (s)% ⊦ fs[ax0 + ax1] = fs[ax0] + fs[ax1]; (s)% ⊦ adr + ax = adr ' + ax; (s)% ⊦ ri[key ' + kx] = ri[key] + ri[kx]; (s)% ⊦ ri[kx0 + kx1] = ri[kx0] + ri[kx1]; (s)%⊦ # ax = # kx0 + # kx1 + 1 ∧ ¬ key ∈ kx1 → ri[kx0 + key ' + kx1, ax][key] = ax[# kx0]; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ dups(kx + key ' + kx0) ↔ key ∈ kx ∨ key ∈ kx0 ∨ dups(kx + kx0); (ws)% ⊦ ks ∪ ks0 ⊆ ks1 ↔ ks ⊆ ks1 ∧ ks0 ⊆ ks1; (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)% ⊦ m +1 = m + 1; (s)% ⊦ #(key ' + kx) = (# kx)+1; (s)% ⊦ #(kx + kx0) = # kx + # kx0; (s)%a: ⊦ (kx + kx0) + kx1 = kx + kx0 + kx1; from specification list[key-list-set]% ⊦ key + kx = key ' + kx; (s)