| # buf0 = # buf, subarray(buf0, m0 + ENCODED_NAT_SIZE, # buf - m0 + ENCODED_NAT_SIZE) = subarray(buf, m0 + ENCODED_NAT_SIZE, # buf - m0 + ENCODED_NAT_SIZE), subarray(buf0, 0, m0) = subarray(buf, 0, m0), is-aligned(# buf, EB_PAGE_SIZE), is-encoded(orphans2 \ orphans1, subarray(buf, 0, m0)), n ∈ orphans2, n ∈ orphans1, m0 + ENCODED_NAT_SIZE ≤ LEB_SIZE, m0 + ENCODED_NAT_SIZE ≤ # buf, m0 + # orphans1 * ENCODED_NAT_SIZE ≤ LEB_SIZE, m0 + # orphans1 * ENCODED_NAT_SIZE ≤ # buf, # orphans2 * ENCODED_NAT_SIZE ≤ LEB_SIZE, # buf ≤ LEB_SIZE, orphans1 ⊆ orphans2, err = ESUCCESS → is-encoded(n, subarray(buf0, m0, ENCODED_NAT_SIZE)) ∧ m = ENCODED_NAT_SIZE, err = ESUCCESS ∨ ⌊err⌋ ⊦ # orphans1 = 0, # orphans2 = 0, orphans1 = ∅, orphans2 = ∅, (err = ESUCCESS ∨ ⌊err⌋ ) ∧ orphans1 -- n ⊆ orphans2 ∧ ( err = ESUCCESS → (m0 + ENCODED_NAT_SIZE) + #(orphans1 -- n) * ENCODED_NAT_SIZE ≤ # buf ∧ is-encoded(orphans2 \ (orphans1 -- n), subarray(buf0, 0, m0 + ENCODED_NAT_SIZE))) ∧ #(orphans1 -- n) < # orphans1 |
# buf0 = # buf, subarray(buf0, m0 + ENCODED_NAT_SIZE, # buf - m0 + ENCODED_NAT_SIZE) = subarray(buf, m0 + ENCODED_NAT_SIZE, # buf - m0 + ENCODED_NAT_SIZE), subarray(buf0, 0, m0) = subarray(buf, 0, m0), is-aligned(# buf, EB_PAGE_SIZE), is-encoded(n, subarray(buf0, m0, ENCODED_NAT_SIZE)), is-encoded(orphans2 \ orphans1, subarray(buf, 0, m0)), n ∈ orphans2, n ∈ orphans1, m0 + ENCODED_NAT_SIZE ≤ LEB_SIZE, m0 + ENCODED_NAT_SIZE ≤ # buf, m0 + # orphans1 * ENCODED_NAT_SIZE ≤ LEB_SIZE, m0 + # orphans1 * ENCODED_NAT_SIZE ≤ # buf, # orphans2 * ENCODED_NAT_SIZE ≤ LEB_SIZE, # buf ≤ LEB_SIZE, orphans1 ⊆ orphans2 ⊦ # orphans1 = 0, # orphans2 = 0, orphans1 = ∅, orphans2 = ∅, m0 + ENCODED_NAT_SIZE + (# orphans1 - 1) * ENCODED_NAT_SIZE ≤ # buf ∧ is-encoded((orphans2 \ orphans1) ++ n, subarray(buf0, 0, m0 + ENCODED_NAT_SIZE))
Used simplifier rules: ⊦ # subarray(buf, m, n) = n; (s)%is-encoded-size: ⊦ is-encoded(n, buf) → # buf = ENCODED_NAT_SIZE; (forward) from specification encoding-fixed-size[encoding-nat]%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ ¬ n < n; (s)% ⊦ m < n + 1 ↔ ¬ n < m; (s)%n0 ≤ n ⊦ n - n0 < m ↔ n < m + n0; (s)% ⊦ m < 1 ↔ m = 0; (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)% ⊦ n ∈ ns ∧ ns ⊆ ns0 → ns0 \ (ns -- n) = (ns0 \ ns) ++ n; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ n ∈ ns → #(ns -- n) = # ns - 1; (s)% ⊦ ns ⊆ ns0 → ns -- n ⊆ ns0; (s)