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