| # buf1 = align↑(node-size-headerless(nd), 2 * NODE_HEADER_SIZE), # buf = NODE_HEADER_SIZE, is-encoded(nodeheader(node-size-headerless(nd), false), buf), is-encoded(nd, subarray(buf1 + buf2, 0, node-size-headerless(nd))), range=(buf + buf1 + buf2, NODE_HEADER_SIZE + # buf1, validtrailer, 0, NODE_HEADER_SIZE), NODE_HEADER_SIZE ≤ # buf2, node-size-headerless(nd) ≤ # buf1 + # buf2 ⊦ ∃ buf0, buf3. buf + buf1 + subarray(buf2, 0, NODE_HEADER_SIZE) = buf0 + buf3 + validtrailer ∧ is-encoded(nodeheader(node-size-headerless(nd), false), buf0) ∧ is-encoded(nd, subarray(buf3, 0, node-size-headerless(nd))) ∧ # buf3 = # buf1 |
⊦ range=(buf, n0, buf0, n1, m) ↔ n0 + m ≤ # buf ∧ n1 + m ≤ # buf0 ∧ subarray(buf, n0, m) = subarray(buf0, n1, m)
# buf = NODE_HEADER_SIZE, # buf1 = align↑(node-size-headerless(nd), 2 * NODE_HEADER_SIZE), subarray(buf + buf1 + buf2, NODE_HEADER_SIZE + # buf1, NODE_HEADER_SIZE) = subarray(validtrailer, 0, NODE_HEADER_SIZE), is-encoded(nd, subarray(buf1 + buf2, 0, node-size-headerless(nd))), is-encoded(nodeheader(node-size-headerless(nd), false), buf), node-size-headerless(nd) ≤ # buf1 + # buf2, NODE_HEADER_SIZE ≤ # buf2, (NODE_HEADER_SIZE + # buf1) + NODE_HEADER_SIZE ≤ #(buf + buf1 + buf2), 0 + NODE_HEADER_SIZE ≤ # validtrailer ⊦ ∃ buf0, buf3. buf + buf1 + subarray(buf2, 0, NODE_HEADER_SIZE) = buf0 + buf3 + validtrailer ∧ is-encoded(nodeheader(node-size-headerless(nd), false), buf0) ∧ is-encoded(nd, subarray(buf3, 0, node-size-headerless(nd))) ∧ # buf3 = # buf1
Used terms: NODE_HEADER_SIZE, 0, validtrailer, NODE_HEADER_SIZE + # buf1, buf + buf1 + buf2