| @(m3, m4) ' + lax0 = lax1 + @(m1, m2) ' + lax, lax1 = ladr + lax3, # lax1 ≤ # lax0, ∀ n, m, m0, m1, m2. n < # lax0 → (lax0.to-adr(m)[n] = @(m0, m1, m2) ↔ (∃ lax2, lax1. lax0 = lax2 + @(m1, m2) ' + lax1 ∧ m0 = m ∧ # lax2 = n)) ∨ lax0 = [], @(m3, m4) ∈ lax1 ∨ @(m3, m4) = @(m1, m2) ∨ @(m3, m4) ∈ lax ⊦ (@(m, m3, m4) ' + lax0.to-adr(m))[# lax1] = @(m, m1, m2) |
∀ n, m0, m3, m4, m5. ¬ # lax3 + # lax < n → ( (lax3.to-adr(m0) + @(m0, m1, m2) ' + lax.to-adr(m0))[n] = @(m3, m4, m5) ↔ (∃ lax2, lax1. lax3 + @(m1, m2) ' + lax = lax2 + @(m4, m5) ' + lax1 ∧ m3 = m0 ∧ # lax2 = n)) ⊦ (lax3.to-adr(m) + @(m, m1, m2) ' + lax.to-adr(m))[# lax3] = @(m, m1, m2)
Used simplifier rules: ⊦ lax + ladr ' + lax0 ≠ []; (s)% ⊦ ¬ m + n < m; (s)% ⊦ m < n + 1 ↔ ¬ n < m; (s)% ⊦ adr + ax = adr ' + ax; (s)% ⊦ @(m, m0).size = m0; (s)% ⊦ @(m, m0).off = m; (s)%⊦ (ladr ' + lax).to-adr(n) = @(n, ladr.off, ladr.size) + lax.to-adr(n); (s)% ⊦ (lax0 + lax1).to-adr(n) = lax0.to-adr(n) + lax1.to-adr(n); (s)% ⊦ m + 1 ≠ 0; (s)% ⊦ #(lax + lax0) = # lax + # lax0; (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ ladr ∈ ladr0 ' + lax ↔ ladr = ladr0 ∨ ladr ∈ lax; (s)% ⊦ m + 1 ≤ n ↔ m < n; (s)%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ (adr ' + ax)[n + 1] = ax[n]; (s)% ⊦ m +1 = m + 1; (s)% ⊦ #(ladr ' + lax) = (# lax)+1; (s)% ⊦ ladr ' + lax = ladr0 ' + lax0 ↔ ladr = ladr0 ∧ lax = lax0; (ws)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ ladr + lax = ladr ' + lax; (s)