| abs-nodes(buf0, n + # buf1, nd ' + x0, @(m0, m1) ' + lax0, weak), abs-padding(buf1), is-encoded(nodeheader(m, boolvar0), subarray(buf1, 0, NODE_HEADER_SIZE)), 2 * NODE_HEADER_SIZE + align↑(m, 2 * NODE_HEADER_SIZE) ≤ # buf1 + # buf0 ⊦ subarray(buf1 + buf0, NODE_HEADER_SIZE + align↑(m, 2 * NODE_HEADER_SIZE), NODE_HEADER_SIZE) = validtrailer |
⊦ abs-padding(buf) ↔ (∃ buf0, buf1. buf = buf0 + buf1 + validtrailer ∧ is-encoded(nodeheader(# buf1, true), buf0) ∧ is-aligned(# buf1, 2 * NODE_HEADER_SIZE))
Used simplifier rules: abs-nodes-mkbuf0-empty-h: ⊦ abs-nodes(mkbuf(0), m, x, lax, weak) ↔ x = [] ∧ lax = [];%abs-nodes-headerspace: # buf ≠ 0 ⊦ abs-nodes(buf, m, x, lax, weak) → (NODE_HEADER_SIZE ≤ # buf + n ↔ NODE_HEADER_SIZE ≤ # buf);%abs-nodes-nospace-h: # buf < NODE_HEADER_SIZE ⊦ abs-nodes(buf, m, x, lax, boolvar) ↔ x = [] ∧ lax = [] ∧ buf = mkbuf(0);% ⊦ #(buf + buf0) = # buf + # buf0; (s)% ⊦ # validtrailer = NODE_HEADER_SIZE; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%m2 ≠ 0 ⊦ (* m2) * m + n ≤ m + n0 ↔ (m2 - 1) * m + n ≤ n0; (s)% ⊦ m0 * 1 = m0; (s)%mult-a: ⊦ m0 * m * n = (m0 * m) * n; from specification nat-mult%mult-c: ⊦ m * n = n * m; from specification nat-mult%c: ⊦ m + n = n + m; from specification nat-basic%lfw-is-encoded-nodeheader-size: ⊦ is-encoded(ndhd, buf) → # buf = NODE_HEADER_SIZE; (forward) from specification abs-node%n = # buf ⊦ subarray(buf + buf0, 0, n) = buf; (s)% ⊦ is-encoded(ndhd, buf) → (is-encoded(ndhd0, buf) ↔ ndhd = ndhd0); (s)%⊦ nodeheader(m, boolvar) = nodeheader(m0, boolvar0) ↔ m = m0 ∧ (boolvar ↔ boolvar0); (ws)% ⊦ 2 * m = 0 ↔ m = 0; (s)% ⊦ NODE_HEADER_SIZE ≠ 0; (s)%m ≠ 0 ⊦ is-aligned(n, m) → n % m = 0; (s)%n ≠ 0, m % n = 0 ⊦ align↑(m, n) = m; (s)% ⊦ m ≤ m + n; (s)% ⊦ m + m = 2 * m; (s)% ⊦ m + n ≤ m + n0 ↔ n ≤ n0; (s)%# buf ≤ n0, n0 + m ≤ # buf + # buf0 ⊦ subarray(buf + buf0, n0, m) = subarray(buf0, n0 - # buf, m); (s)% ⊦ m + n - m = n; (s)% ⊦ m ≤ m; (s)% ⊦ # buf = 0 ↔ buf = mkbuf(0); (s)% ⊦ # mkbuf(n) = n; (s)% ⊦ n + 0 = n; (s)% ⊦ a ' + x ≠ []; (s)%a: ⊦ (x + y) + z = x + y + z; from specification list% ⊦ m ≤ n ↔ ¬ n < m; (ss)% ⊦ m - m = 0; (s)% ⊦ ¬ n < n; (s)%n + m ≤ # buf ⊦ subarray(buf + buf0, n, m) = subarray(buf, n, m); (s)%# buf = n ⊦ subarray(buf, 0, n) = buf; (s) Used terms: buf1