| # ax0 = # ax, ax0.toSet ⊆ range ri, ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]) ⊦ key ∈ ri[keys(fs, ax0), ax] ↔ key ∈ ri |
#(adr + ax1) = # ax, (adr + ax1).toSet ⊆ range ri, ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]), ∀ ax, ri, fs, key. # ax1 = # ax ∧ ax1.toSet ⊆ range ri ∧ (∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]])) → (key ∈ ri[keys(fs, ax1), ax] ↔ key ∈ ri) ⊦ key ∈ ri[keys(fs, adr + ax1), ax] ↔ key ∈ ri
Used simplifier rules: address-list freely generated by [], +;;% ⊦ # [] = 0; (s)% ⊦ # ax = 0 ↔ ax = []; (s)% ⊦ keys(fs, []) = []; (s)% ⊦ [].toSet = ∅; (s)% ⊦ ∅ ⊆ as; (s)% ⊦ ri[[], []] = ri; (s)