| buf0 = buf, buf ≠ mkbuf(0), is-aligned(# buf, 2 * NODE_HEADER_SIZE) ⊦ ⟪encode_header#(nodeheader(# buf - 2 * NODE_HEADER_SIZE, true), 0; buf; err); buf := copy(validtrailer, 0, buf, # buf - NODE_HEADER_SIZE, NODE_HEADER_SIZE)⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ # buf = # buf0 ∧ (err = ESUCCESS → abs-padding(buf))) |
# buf = n0 + 2 * NODE_HEADER_SIZE, buf0 = buf, is-aligned(# buf, 2 * NODE_HEADER_SIZE), 2 * NODE_HEADER_SIZE ≤ # buf ⊦ ⟪encode_header#(nodeheader(n0, true), 0; buf; err); buf := copy(validtrailer, 0, buf, # buf - NODE_HEADER_SIZE, NODE_HEADER_SIZE)⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ # buf = # buf0 ∧ (err = ESUCCESS → abs-padding(buf))), buf = mkbuf(0)
Used simplifier rules: ⊦ m ≤ n ↔ ¬ n < m; (ss)% ⊦ 2 * m = 0 ↔ m = 0; (s)% ⊦ NODE_HEADER_SIZE ≠ 0; (s)%mult-a: ⊦ m0 * m * n = (m0 * m) * n; from specification nat-mult%mult-c: ⊦ m * n = n * m; from specification nat-mult%m ≠ 0 ⊦ is-aligned(n, m) → (n < m ↔ n = 0); (s)% ⊦ # buf = 0 ↔ buf = mkbuf(0); (s)%n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: # buf, 2 * NODE_HEADER_SIZE, n