| @(m3, m4) ' + lax0 = lax1 + @(m1, m2) ' + lax, # 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) |
@(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)
Used simplifier rules: laddress-list freely generated by [], +;;% ⊦ [] + lax = lax; (s)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ ladr ' + lax = ladr0 ' + lax0 ↔ ladr = ladr0 ∧ lax = lax0; (ws)% ⊦ @(m, m0) = @(m1, m2) ↔ m = m1 ∧ m0 = m2; (ws)% ⊦ # [] = 0; (s)% ⊦ (adr ' + ax)[0] = adr; (s)%a: ⊦ (ax + ax0) + ax1 = ax + ax0 + ax1; from specification list[address-list-set]% ⊦ @(m, m0, m1) = @(m2, m3, m4) ↔ m = m2 ∧ m0 = m3 ∧ m1 = m4; (ws)