| # buf2 = NODE_HEADER_SIZE, # buf = nd.alignedsize, n0 < NODE_HEADER_SIZE + nd.alignedsize, abs-nodes(buf0, 2 * NODE_HEADER_SIZE + m + nd.alignedsize, x1, lax1, true), is-aligned(n0, NODE_HEADER_SIZE), is-encoded(nd, subarray(buf, 0, node-size-headerless(nd))), is-encoded(nodeheader(node-size-headerless(nd), false), buf2), n0 ≤ NODE_HEADER_SIZE + nd.alignedsize + # buf0, ∀ buf3, m, x, lax, n. # buf3 < #(buf2 + (buf + validtrailer) + buf0) → abs-nodes(buf3, m, x, lax, true) ∧ is-aligned(n, NODE_HEADER_SIZE) ∧ n ≤ # buf3 → (∃ x0, lax0. x0 ⊑ x ∧ lax0 ⊑ lax ∧ abs-nodes(subarray(buf3, 0, n), m, x0, lax0, true)) ⊦ #(buf2 + subarray((buf + validtrailer) + buf0, 0, n0)) ≥ NODE_HEADER_SIZE ∧ is-aligned(#(buf2 + subarray((buf + validtrailer) + buf0, 0, n0)), NODE_HEADER_SIZE) ∧ (∃ buf3, buf1. buf2 + subarray((buf + validtrailer) + buf0, 0, n0) = buf3 + buf1 ∧ # buf3 = NODE_HEADER_SIZE ∧ (is-garbage-header(buf3) ∨ (∃ ndhd. is-encoded(ndhd, buf3) ∧ # buf1 ≤ align↑(ndhd.size, 2 * NODE_HEADER_SIZE)))) |
# buf2 = NODE_HEADER_SIZE, # buf = nd.alignedsize, n0 < NODE_HEADER_SIZE + nd.alignedsize, abs-nodes(buf0, 2 * NODE_HEADER_SIZE + m + nd.alignedsize, x1, lax1, true), is-aligned(n0, NODE_HEADER_SIZE), is-encoded(nd, subarray(buf, 0, node-size-headerless(nd))), is-encoded(nodeheader(node-size-headerless(nd), false), buf2), n0 ≤ NODE_HEADER_SIZE + nd.alignedsize + # buf0, ∀ buf3, m, x, lax, n. # buf3 < #(buf2 + (buf + validtrailer) + buf0) → abs-nodes(buf3, m, x, lax, true) ∧ is-aligned(n, NODE_HEADER_SIZE) ∧ n ≤ # buf3 → (∃ x0, lax0. x0 ⊑ x ∧ lax0 ⊑ lax ∧ abs-nodes(subarray(buf3, 0, n), m, x0, lax0, true)) ⊦ ∃ buf3, buf1. buf2 + subarray((buf + validtrailer) + buf0, 0, n0) = buf3 + buf1 ∧ # buf3 = NODE_HEADER_SIZE ∧ (is-garbage-header(buf3) ∨ (∃ ndhd. is-encoded(ndhd, buf3) ∧ # buf1 ≤ align↑(ndhd.size, 2 * NODE_HEADER_SIZE)))
Used simplifier rules: n ≠ 0 ⊦ is-aligned(n, n); (s)% ⊦ m ≤ m + n; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%m ≠ 0, is-aligned(n1, m) ⊦ is-aligned(n0 + n1, m) ↔ is-aligned(n0, m); (s)% ⊦ NODE_HEADER_SIZE ≠ 0; (s)% ⊦ n ≥ m ↔ m ≤ n; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]% ⊦ # subarray(buf, m, n) = n; (s)% ⊦ #(buf + buf0) = # buf + # buf0; (s)