| # buf < ENCODED_NAT_SIZE ⊦ n = # ns ∧ (∃ buf0, buf1. is-aligned(# buf, EB_PAGE_SIZE) ∧ buf = buf0 + buf1 ∧ is-encoded(ns, buf0)) ↔ ns = ∅ ∧ n = 0 ∧ is-aligned(# buf, EB_PAGE_SIZE) |
# buf0 = # ns * ENCODED_NAT_SIZE, # buf0 + # buf1 < ENCODED_NAT_SIZE, is-aligned(# buf0 + # buf1, EB_PAGE_SIZE), is-encoded(ns, buf0) ⊦ # ns = 0, ns = ∅
Used simplifier rules: is-encoded-base: ⊦ is-encoded(∅, buf) ↔ buf = mkbuf(0);%is-encoded-size: ⊦ is-encoded(ns, buf) → # buf = # ns * ENCODED_NAT_SIZE;%size-zero: ⊦ # ns ≠ 0 → ns ≠ ∅; (forward) from specification set-basic[nat-set]%size-zero-01: ⊦ ns ≠ ∅ → # ns ≠ 0; (forward) from specification set-basic[nat-set]% ⊦ mkbuf(0) + buf = buf; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ n + 0 = n; (s)% ⊦ # mkbuf(n) = n; (s)% ⊦ # ∅ = 0; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]% ⊦ #(buf + buf0) = # buf + # buf0; (s)