| # x = # lax, # x1 = # lax1, st[m0] = mkblock(x0, lax0, m4), st[n] = mkblock(x, lax, m3), @(m1, m2) ∈ lax0, m0 ∈ st, n ∈ st, @(m0, m1, m2) ∈ st[n, mkblock(x + x1, lax + lax1, m)] ⊦ st[n, mkblock(x + x1, lax + lax1, m)][@(m0, m1, m2).lnum].list [pos(@(@(m0, m1, m2).pos, @(m0, m1, m2).size), st[n, mkblock(x + x1, lax + lax1, m)][@(m0, m1, m2).lnum].ladrlist) ] = x0[pos(@(m1, m2), lax0)], dups(lax1), dups(lax), dups(lax + lax1) |
# x1 = # lax1, # x = # lax, st[n] = mkblock(x, lax, m3), st[m0] = mkblock(x0, lax0, m4), n ∈ st, m0 ∈ st, @(m1, m2) ∈ lax0 ⊦ st[n, mkblock(x + x1, lax + lax1, m)][m0].list[pos(@(m1, m2), st[n, mkblock(x + x1, lax + lax1, m)][m0].ladrlist)] = x0[pos(@(m1, m2), lax0)], dups(lax + lax1), dups(lax), dups(lax1)
Used simplifier rules: in-write-app: # x1 = # lax1, # x = # lax, st[n].list = x, st[n].ladrlist = lax ⊦ n ∈ st → ( adr ∈ st[n, mkblock(x + x1, lax + lax1, m)] ↔ adr ∈ st ∨ adr ∈ lax1.to-adr(n));%in-in-adr: ⊦ st[n] = mkblock(x, lax, m0) ∧ n ∈ st ∧ @(n0, n1) ∈ lax → @(n, n0, n1) ∈ st;%in: ⊦ adr ∈ st ↔ adr.lnum ∈ st ∧ @(adr.pos, adr.size) ∈ st[adr.lnum].ladrlist;%a: ⊦ ¬ dups(lax + lax0) → ¬ dups(lax) ∧ ¬ dups(lax0); (forward) from specification list-dup[laddress-list]%a: ⊦ (x + y) + z = x + y + z; from specification list%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ mkblock(x, lax, m).ladrlist = lax; (s)% ⊦ mkblock(x, lax, m).list = x; (s)% ⊦ @(m, m0, m1).size = m1; (s)% ⊦ @(m, m0, m1).pos = m0; (s)% ⊦ @(m, m0, m1).lnum = m; (s)