| st[n] = mkblock(x, lax, m0), inv(mkblock(x, lax, m0)), n ∈ st ⊦ @(m, m2) ∈ lax, ∀ adr. (adr ∈ nodes(st[n, mkblock(x + a ', lax + @(m, m2) ', m1)]) ↔ adr ∈ nodes(st)[@(n, m, m2), a]) ∧ ( adr ∈ nodes(st[n, mkblock(x + a ', lax + @(m, m2) ', m1)]) → nodes(st[n, mkblock(x + a ', lax + @(m, m2) ', m1)])[adr] = nodes(st)[@(n, m, m2), a][adr]) |
st[n] = mkblock(x, lax, m0), inv(mkblock(x, lax, m0)), n ∈ st ⊦ @(m, m2) ∈ lax, (adr ∈ st ∨ adr = @(n, m, m2) → adr ∈ nodes(st)[@(n, m, m2), a]) ∧ (adr ∈ st ∨ adr = @(n, m, m2) → nodes(st[n, mkblock(x + a ', lax + @(m, m2) ', m1)])[adr] = nodes(st)[@(n, m, m2), a][adr])
Used simplifier rules: in-nodes: ⊦ adr ∈ nodes(st) ↔ adr ∈ st;% ⊦ adr ≠ adr0 → (adr ∈ ast[adr0, a0] ↔ adr ∈ ast); (s)%a: ⊦ (x + y) + z = x + y + z; from specification list%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ adr ∈ adr0 ' ↔ adr = adr0; (s)% ⊦ @(m, m0).size = m0; (s)% ⊦ @(m, m0).off = m; (s)% ⊦ ladr '.to-adr(n) = @(n, ladr.off, ladr.size) '; (s)%# 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)); (s)% ⊦ mkblock(x, lax, m).ladrlist = lax; (s)% ⊦ mkblock(x, lax, m).list = x; (s)% ⊦ inv(mkblock(x, lax, m0)) → (# x = # lax ↔ true); (ss)% ⊦ # ladr ' = 0 +1; (s)% ⊦ # a ' = 0 +1; (s)