| n < #(ladr + 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 = [] ⊦ ladr + lax0 = [], (ladr + lax0).to-adr(m)[n] = @(m0, m1, m2) ↔ (∃ lax2, lax1. ladr + lax0 = lax2 + @(m1, m2) ' + lax1 ∧ m0 = m ∧ # lax2 = n) |
n ≤ # 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 = [] ⊦ (@(m, ladr.off, ladr.size) ' + lax0.to-adr(m))[n] = @(m0, m1, m2) ↔ (∃ lax, lax1. ladr ' + lax0 = lax + @(m1, m2) ' + lax1 ∧ m0 = m ∧ # lax = n)
Used simplifier rules: ⊦ m < n ↔ ¬ n ≤ m; (ss)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m < n + 1 ↔ ¬ n < m; (s)% ⊦ m +1 = m + 1; (s)% ⊦ #(ladr ' + lax) = (# lax)+1; (s)% ⊦ ladr ' + lax ≠ []; (s)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ adr + ax = adr ' + ax; (s)%⊦ (ladr ' + lax).to-adr(n) = @(n, ladr.off, ladr.size) + lax.to-adr(n); (s)% ⊦ ladr + lax = ladr ' + lax; (s)