| # x0 = # lax0, # x = # lax2 + # lax1 + 1, st0[m] = mkblock(x, lax2 + @(m0, m1) ' + lax1, m2), st1[m] = mkblock(x0, lax0, m3), @(m0, m1) ∈ lax0, m ∈ st0, m ∈ st1, x ⊑ x0, ∀ n. n ∈ st0 → n ∈ st1, ∃ lax3. (lax2 + @(m0, m1) ' + lax1) + lax3 = lax0 ⊦ x[# lax2] = x0[pos(@(m0, m1), lax0)], @(m0, m1) ∈ lax2 |
# x = # lax2 + # lax1 + 1, # x0 = # lax2 + (# lax1 + # lax) + 1, st1[m] = mkblock(x0, (lax2 + @(m0, m1) ' + lax1) + lax, m3), st0[m] = mkblock(x, lax2 + @(m0, m1) ' + lax1, m2), m ∈ st1, m ∈ st0, x ⊑ x0, ∀ n. n ∈ st0 → n ∈ st1 ⊦ x[# lax2] = x0[# lax2], @(m0, m1) ∈ lax2
Used simplifier rules: ⊦ ladr ∈ ladr0 ' + lax ↔ ladr = ladr0 ∨ ladr ∈ lax; (s)% ⊦ ladr ∈ lax + lax0 ↔ ladr ∈ lax ∨ ladr ∈ lax0; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ n + 0 = n; (s)% ⊦ pos(ladr, ladr ' + lax) = 0; (s)% ⊦ ¬ ladr ∈ lax → pos(ladr, lax + lax0) = pos(ladr, lax0) + # lax; (s)% ⊦ m +1 = m + 1; (s)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ #(ladr ' + lax) = (# lax)+1; (s)% ⊦ #(lax + lax0) = # lax + # lax0; (s)