| # ax0 = # kx1, new(ax0, fs), key1 ∈ ri, key ∈ ri, kx1.toSet ⊆ dom ri, ∀ kx0, fs0, key0, ri0. # kx1 = # kx0 ∧ new(ax0, fs0) ∧ key0 ∈ ri0 ∧ kx0.toSet ⊆ dom ri0 ∧ (∀ key. key ∈ ri0 → ri0[key] ∈ fs0 ∧ key-cons(key, fs0[ri0[key]])) → fs0[ax0, fs0[ri0[kx0]]][ri0[kx0, ax0][key0]] = fs0[ri0[key0]] ∨ dups(kx0), ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]), ∃ kx0, kx2. kx1 = kx0 + (key + kx2) ⊦ fs[ri[key1]] = fs[ri[key]], dups(kx1), dups(ax0), ri[kx1, ax0][key] ∈ fs, ri[kx1, ax0][key] ∈ ax0, key1 ∈ kx1 |
# ax0 = # kx0 + # kx + 1, new(ax0, fs), key ∈ ri, key1 ∈ ri, kx.toSet ⊆ dom ri, kx0.toSet ⊆ dom ri, ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]), ∀ kx1, fs0, key0, ri0. # ax0 = # kx1 ∧ new(ax0, fs0) ∧ key0 ∈ ri0 ∧ kx1.toSet ⊆ dom ri0 ∧ (∀ key. key ∈ ri0 → ri0[key] ∈ fs0 ∧ key-cons(key, fs0[ri0[key]])) → fs0[ax0, fs0[ri0[kx1]]][ri0[kx1, ax0][key0]] = fs0[ri0[key0]] ∨ dups(kx1) ⊦ fs[ri[key1]] = fs[ri[key]], dups(ax0), dups(kx0 + kx), dups(kx0), dups(kx), key ∈ kx0, key ∈ kx, key1 ∈ kx0, key1 ∈ kx, ax0[# kx0] ∈ ax0, ax0[# kx0] ∈ fs
Used simplifier rules: a: ⊦ ¬ dups(kx + kx0) → ¬ dups(kx) ∧ ¬ dups(kx0); (forward) from specification list-dup[key-list-set]%⊦ # 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)% ⊦ key ∈ key0 ' + kx ↔ key = key0 ∨ key ∈ kx; (s)% ⊦ key ∈ kx + kx0 ↔ key ∈ kx ∨ key ∈ kx0; (s)% ⊦ 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)