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