| # buf = (a ' + []).flashsize ⊦ (∃ buf0, buf1. buf = buf0 + buf1 ∧ lax ≠ [] ∧ lax.head.off = m ∧ lax.head.size = # buf0 ∧ abs-node(buf0, a) ∧ abs-nodes(buf1, m + # buf0, [], lax.tail, false)) ↔ lax = @(m, # buf) ' ∧ abs-node(buf, a) |
# buf0 = a.alignedsize + 2 * NODE_HEADER_SIZE, lax.head.size = # buf0, lax.tail = [], abs-node(buf0, a) ⊦ lax = [], lax = @(lax.head.off, # buf0) '
Used simplifier rules: flashsize-one: ⊦ a '.flashsize = a.flashsize;%abs-nodes-mkbuf0-empty-h: ⊦ abs-nodes(mkbuf(0), m, x, lax, weak) ↔ x = [] ∧ lax = [];%abs-nodes-elems-empty-adr-empty-h: ⊦ abs-nodes(buf, m, [], lax, weak) → lax = [];%ls-abs-node-buf-size: ⊦ abs-node(buf, nd) → # buf = nd.alignedsize + 2 * NODE_HEADER_SIZE;%abs-nodes-nospace-h: # buf < NODE_HEADER_SIZE ⊦ abs-nodes(buf, m, x, lax, boolvar) ↔ x = [] ∧ lax = [] ∧ buf = mkbuf(0);% ⊦ abs-node(buf, nd0) → (abs-node(buf, nd1) ↔ nd0 = nd1); (s)% ⊦ NODE_HEADER_SIZE ≠ 0; (s)% ⊦ 0 < m ↔ m ≠ 0; (s)% ⊦ # mkbuf(n) = n; (s)% ⊦ buf + mkbuf(0) = buf; (s)% ⊦ ladr '.tail = []; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ # buf = 0 ↔ buf = mkbuf(0); (s)% ⊦ m = m + n ↔ n = 0; (s)% ⊦ @(m, m0).size = m0; (s)% ⊦ @(m, m0).off = m; (s)% ⊦ ladr '.head = ladr; (s)% ⊦ ladr ' ≠ []; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]% ⊦ #(buf + buf0) = # buf + # buf0; (s)% ⊦ nd.flashsize = 2 * NODE_HEADER_SIZE + nd.alignedsize; (s)%a: ⊦ (x + y) + z = x + y + z; from specification list% ⊦ x + [] = x; (s)