| # kx = # ax, new(ax, fs), ri-closed(ri, fs, ro), ri-cons(ri, fs), kx.toSet ⊆ dom ri ⊦ dups(kx), dups(ax), ri-closed(ri[kx, ax], fs[ax, fs[ri[kx]]], ro) |
#(key + kx0) = # ax, new(ax, fs), ri-closed(ri, fs, ro), ri-cons(ri, fs), (key + kx0).toSet ⊆ dom ri, ∀ ax, fs, ri, ro. # kx0 = # ax ∧ new(ax, fs) ∧ ri-closed(ri, fs, ro) ∧ ri-cons(ri, fs) ∧ kx0.toSet ⊆ dom ri → dups(kx0) ∨ dups(ax) ∨ ri-closed(ri[kx0, ax], fs[ax, fs[ri[kx0]]], ro) ⊦ dups(ax), dups(key + kx0), ri-closed(ri[key + kx0, ax], fs[ax, fs[ri[key + kx0]]], ro)
Used simplifier rules: key-list freely generated by [], +;;% ⊦ # [] = 0; (s)% ⊦ # ax = 0 ↔ ax = []; (s)% ⊦ [].toSet = ∅; (s)% ⊦ ∅ ⊆ ks; (s)% ⊦ ri[[]] = []; (s)% ⊦ fs[[]] = []; (s)% ⊦ ¬ dups([]); (s)% ⊦ new([], fs); (s)% ⊦ ri[[], []] = ri; (s)% ⊦ fs[[], []] = fs; (s)% ⊦ ¬ dups([]); (s)