| # ax = # kx, new(ax, fs), key ∈ ri, kx.toSet ⊆ dom ri, ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]) ⊦ fs[ax, fs[ri[kx]]][ri[kx, ax][key]] = fs[ri[key]], dups(ax), dups(kx) |
#(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)
Used simplifier rules: address-list freely generated by [], +;;% ⊦ # [] = 0; (s)% ⊦ # kx = 0 ↔ kx = []; (s)% ⊦ new([], fs); (s)% ⊦ ¬ dups([]); (s)% ⊦ ri[[]] = []; (s)% ⊦ fs[[]] = []; (s)% ⊦ fs[[], []] = fs; (s)% ⊦ ri[[], []] = ri; (s)