| # ax0 = # kx1 + # kx + 1, range ri ∩ ax0.toSet = ∅, ri-inj(ri), key0 ∈ ri[kx1 + key0 ' + kx, ax0], ∀ kx2, ax, ri, key, key2. # kx2 < #((kx1 + key0 ' + kx) + key1 ') → # ax = # kx2 ∧ ri[kx2, ax][key] = ri[kx2, ax][key2] ∧ ax.toSet ∩ range ri = ∅ ∧ ri-inj(ri) ∧ key ∈ ri[kx2, ax] ∧ key2 ∈ ri[kx2, ax] → key = key2 ∨ dups(ax) ∨ key ∈ ri ∧ key2 ∈ ri ∧ ri[key] = ri[key2] ⊦ key1 = key0, dups(ax0), key0 ∈ kx, ax0[# kx1] ∈ ri, ax0[# kx1] ∈ ax0, key1 ∈ ri ∧ key0 ∈ ri ∧ ri[key1] = ri[key0] |
n ≤ # ax ⊦ ∃ ax0, ax1. ax = ax0 + ax1 ∧ # ax0 = n
# ax0 = # kx1 + # kx + 1, range ri ∩ ax0.toSet = ∅, ri-inj(ri), key0 ∈ ri[kx1 + key0 ' + kx, ax0], ∃ ax2, ax1. ax0 = ax2 + ax1 ∧ # ax2 = # kx1, ∀ kx2, ax, ri, key, key2. # kx2 < #((kx1 + key0 ' + kx) + key1 ') → # ax = # kx2 ∧ ri[kx2, ax][key] = ri[kx2, ax][key2] ∧ ax.toSet ∩ range ri = ∅ ∧ ri-inj(ri) ∧ key ∈ ri[kx2, ax] ∧ key2 ∈ ri[kx2, ax] → key = key2 ∨ dups(ax) ∨ key ∈ ri ∧ key2 ∈ ri ∧ ri[key] = ri[key2] ⊦ key1 = key0, dups(ax0), ax0[# kx1] ∈ ax0, ax0[# kx1] ∈ ri, key0 ∈ kx, key1 ∈ ri ∧ key0 ∈ ri ∧ ri[key1] = ri[key0]
Used simplifier rules: ⊦ m ≤ n ↔ ¬ n < m; (ss)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic% ⊦ # kx = 0 ↔ kx = []; (s)% ⊦ ¬ m + n < m; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic Used terms: # kx1, ax0