| # buf = x.flashsize, x = nd + x0, n < x.flashsize, abs-nodes(buf, m, x, lax, false), is-aligned(n, NODE_HEADER_SIZE), ∀ buf0, x, n, m, lax. # buf0 < # buf → # buf0 = x.flashsize ∧ n < x.flashsize ∧ abs-nodes(buf0, m, x, lax, false) ∧ is-aligned(n, NODE_HEADER_SIZE) → n = 0 ∨ x = [] ∨ (∃ n0. n0 < # lax ∧ abs-nodes(subarray(buf0, 0, n), m, prefixn(n0, x), prefixn(n0, lax), true)) ⊦ n = 0, x = [], ∃ n0. n0 < # lax ∧ abs-nodes(subarray(buf, 0, n), m, prefixn(n0, x), prefixn(n0, lax), true) |
# buf = (2 * NODE_HEADER_SIZE + nd.alignedsize) + x0.flashsize, n < # buf, abs-nodes(buf, m, nd ' + x0, lax, false), is-aligned(n, NODE_HEADER_SIZE), ∀ buf0, x, n, m, lax. # buf0 < # buf → # buf0 = x.flashsize ∧ n < x.flashsize ∧ abs-nodes(buf0, m, x, lax, false) ∧ is-aligned(n, NODE_HEADER_SIZE) → n = 0 ∨ x = [] ∨ (∃ n0. n0 < # lax ∧ abs-nodes(subarray(buf0, 0, n), m, prefixn(n0, x), prefixn(n0, lax), true)) ⊦ buf = mkbuf(0), n = 0, ∃ n0. n0 < # lax ∧ abs-nodes(subarray(buf, 0, n), m, prefixn(n0, nd ' + x0), prefixn(n0, lax), true)
Used simplifier rules: size-rec: ⊦ (a ' + x).flashsize = a.flashsize + x.flashsize;% ⊦ # buf = 0 ↔ buf = mkbuf(0); (s)%lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic% ⊦ a ' + x ≠ []; (s)%a: ⊦ (x + y) + z = x + y + z; from specification list% ⊦ nd.flashsize = 2 * NODE_HEADER_SIZE + nd.alignedsize; (s)% ⊦ a + x = a ' + x; (s)