| # buf = (2 * NODE_HEADER_SIZE + a.alignedsize) + x.flashsize, ∃ buf0, buf1. buf = buf0 + buf1 ∧ ( abs-padding(buf0) ∧ abs-nodes(buf1, m + # buf0, a ' + x, @(m0, m1) ' + lax0, false) ∨ @(m0, m1) ' + lax0 ≠ [] ∧ (@(m0, m1) ' + lax0).head.off = m ∧ (@(m0, m1) ' + lax0).head.size = # buf0 ∧ abs-node(buf0, a) ∧ abs-nodes(buf1, m + # buf0, x, (@(m0, m1) ' + lax0).tail, false)), ∀ buf0, a, x, m, m0, m1, lax0. # buf0 < # buf → # buf0 = (2 * NODE_HEADER_SIZE + a.alignedsize) + x.flashsize ∧ abs-nodes(buf0, m, a ' + x, @(m0, m1) ' + lax0, false) → (∃ buf2, buf1. buf0 = buf2 + buf1 ∧ m0 = m ∧ m1 = # buf2 ∧ abs-node(buf2, a) ∧ abs-nodes(buf1, m + # buf2, x, lax0, false)) ⊦ ∃ buf0, buf1. buf = buf0 + buf1 ∧ m0 = m ∧ m1 = # buf0 ∧ abs-node(buf0, a) ∧ abs-nodes(buf1, m + # buf0, x, lax0, false) |
# buf1 + # buf0 = (2 * NODE_HEADER_SIZE + a.alignedsize) + x.flashsize, abs-padding(buf1) ∧ abs-nodes(buf0, m + # buf1, a ' + x, @(m0, m1) ' + lax0, false) ∨ m0 = m ∧ m1 = # buf1 ∧ abs-node(buf1, a) ∧ abs-nodes(buf0, m + # buf1, x, lax0, false), ∀ buf2, a, x, m, m0, m1, lax0. # buf2 < #(buf1 + buf0) → # buf2 = (2 * NODE_HEADER_SIZE + a.alignedsize) + x.flashsize ∧ abs-nodes(buf2, m, a ' + x, @(m0, m1) ' + lax0, false) → (∃ buf3, buf1. buf2 = buf3 + buf1 ∧ m0 = m ∧ m1 = # buf3 ∧ abs-node(buf3, a) ∧ abs-nodes(buf1, m + # buf3, x, lax0, false)) ⊦ ∃ buf3, buf2. buf1 + buf0 = buf3 + buf2 ∧ m0 = m ∧ m1 = # buf3 ∧ abs-node(buf3, a) ∧ abs-nodes(buf2, m + # buf3, x, lax0, false)
Used simplifier rules: ⊦ (ladr ' + lax).tail = lax; (s)% ⊦ @(m, m0).size = m0; (s)% ⊦ @(m, m0).off = m; (s)% ⊦ (ladr ' + lax).head = ladr; (s)%a: ⊦ (lax + lax0) + lax1 = lax + lax0 + lax1; from specification list[laddress-list]% ⊦ ladr ' + lax ≠ []; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]% ⊦ #(buf + buf0) = # buf + # buf0; (s)