| nd.key = fs[adr].key, referenced-adrs(ax0, ri) = ax1 + ax, ri-cons(ri, fs), adr ∈ ri, nd ∈ fs[ax], ∃ ax0, ax1. ax = ax0 + ax1 ∧ fs[ax0] = nd ' ∧ fs[ax1] = ndx2 ⊦ dups(fs[ax].keys), dups(fs[ax1].keys), dups(fs[ax1].keys + fs[ax].keys), dups(ax0), adr ∈ ax0 |
fs[adr0].key = fs[adr].key, referenced-adrs(ax0, ri) = ax1 + adr0 ' + ax2, ri-cons(ri, fs), adr ∈ ri ⊦ dups(ax0), dups(fs[ax1].keys + fs[ax2].keys), dups(fs[ax1].keys), dups(fs[ax2].keys), adr ∈ ax0, fs[adr].key ∈ fs[ax1].keys, fs[adr].key ∈ fs[ax2].keys
Used simplifier rules: keys-app: ⊦ (ndx0 + ndx1).keys = ndx0.keys + ndx1.keys;%keys-one: ⊦ nd '.keys = nd.key ';% ⊦ nd ∈ nd0 ' ↔ nd = nd0; (s)%⊦ ¬ key ∈ kx ∧ ¬ key ∈ kx0 → (dups(kx + key ' + kx0) ↔ dups(kx + kx0)); (s)% ⊦ ¬ dups(key '); (s)% ⊦ ¬ dups(kx) → (dups(key ' + kx) ↔ key ∈ kx); (s)% ⊦ dups(kx + key ') ↔ key ∈ kx ∨ dups(kx); (ws)% ⊦ fs[adr '] = fs[adr] '; (s)%a: ⊦ ¬ dups(kx + kx0) → ¬ dups(kx) ∧ ¬ dups(kx0); (forward) from specification list-dup[key-list-set]%a: ⊦ (kx + kx0) + kx1 = kx + kx0 + kx1; from specification list[key-list-set]%a: ⊦ (ndx + ndx0) + ndx1 = ndx + ndx0 + ndx1; from specification list[node-list]% ⊦ nd ∈ ndx + ndx0 ↔ nd ∈ ndx ∨ nd ∈ ndx0; (s)%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]% ⊦ fs[ax0 + ax1] = fs[ax0] + fs[ax1]; (s)% ⊦ fs[ax] = nd ' ↔ (∃ adr. ax = adr ' ∧ fs[adr] = nd); (s)