| #(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 |
# ax1 + 1 = # ax, adr ∈ ri, ax1.toSet ⊆ range ri, ∀ 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. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]) ⊦ key ∈ ri[fs[adr].key ' + keys(fs, ax1), ax] ↔ key ∈ ri
Used simplifier rules: ⊦ adr ∈ range ri ↔ adr ∈ ri; (s)% ⊦ as ++ adr ⊆ as0 ↔ as ⊆ as0 ∧ adr ∈ as0; (ws)%unc: ⊦ as ∪ as0 = as0 ∪ as; from specification set-union[node-store]%una: ⊦ (as ∪ as0) ∪ as1 = as ∪ as0 ∪ as1; from specification set-union[node-store]% ⊦ as ∪ ∅ = as; (s)% ⊦ (as ++ adr) ∪ as0 = (as ∪ as0) ++ adr; (s)% ⊦ adr '.toSet = ∅ ++ adr; (s)% ⊦ (ax + ax0).toSet = ax.toSet ∪ ax0.toSet; (s)% ⊦ key + kx = key ' + kx; (s)% ⊦ keys(fs, adr ' + ax) = fs[adr].key + keys(fs, ax); (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)