| lax0.to-adr(m)[m5] = @(m0, m1, m2), n = m5 + 1, 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 = [] ⊦ n = 0, ∃ lax, lax1. @(m3, m4) ' + lax0 = lax + @(m1, m2) ' + lax1 ∧ m0 = m ∧ # lax = n |
lax0.to-adr(m)[m5] = @(m0, m1, m2), m5 < # lax0, ∀ n, m6, m7, m8, m9. n < # lax0 → (lax0.to-adr(m6)[n] = @(m7, m8, m9) ↔ (∃ lax2, lax1. lax0 = lax2 + @(m8, m9) ' + lax1 ∧ m7 = m6 ∧ # lax2 = n)) ⊦ lax0 = [], ∃ lax, lax1. @(m3, m4) ' + lax0 = lax + @(m1, m2) ' + lax1 ∧ m0 = m ∧ # lax = m5 + 1
Used simplifier rules: ⊦ # lax = 0 ↔ lax = []; (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ m + 1 ≤ n ↔ m < n; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + 1 ≠ 0; (s)