| # ns0 = m + 1, # buf0 = m * ENCODED_NAT_SIZE, # buf1 = ENCODED_NAT_SIZE, m + 1 = # ns1, is-encoded(n, buf1), is-encoded(ns0 -- n, buf0), n ∈ ns0, ∃ n, buf3, buf2. n ∈ ns1 ∧ buf1 + buf0 = buf3 + buf2 ∧ is-encoded(n, buf3) ∧ is-encoded(ns1 -- n, buf2), ∀ ns, buf, ns1. # ns < m + 1 → # buf = # ns1 * ENCODED_NAT_SIZE ∧ # buf = # ns * ENCODED_NAT_SIZE ∧ is-encoded(ns, buf) ∧ is-encoded(ns1, buf) → ns = ns1 ⊦ ns0 = ∅, ns0 = ns1, ns1 = ∅ |
# ns0 = m + 1, # buf = m * ENCODED_NAT_SIZE, # buf2 = ENCODED_NAT_SIZE, m + 1 = # ns1, is-encoded(n0, buf2), is-encoded(ns0 -- n0, buf), is-encoded(ns1 -- n0, buf), n0 ∈ ns1, n0 ∈ ns0, ∀ ns, buf, ns1. # ns < m + 1 → # buf = # ns1 * ENCODED_NAT_SIZE ∧ # buf = # ns * ENCODED_NAT_SIZE ∧ is-encoded(ns, buf) ∧ is-encoded(ns1, buf) → ns = ns1 ⊦ ns0 = ∅, ns0 = ns1, ns1 = ∅
Used simplifier rules: is-encoded-size: ⊦ is-encoded(ns, buf) → # buf = # ns * ENCODED_NAT_SIZE;% ⊦ m + 1 ≠ 0; (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)% ⊦ n ≤ m → m + n0 - n = (m - n) + n0; (s)%is-encoded-size: ⊦ is-encoded(n, buf) → # buf = ENCODED_NAT_SIZE; (forward) from specification encoding-fixed-size[encoding-nat]% ⊦ n ∈ ns → #(ns -- n) = # ns - 1; (s)%size-zero-01: ⊦ ns ≠ ∅ → # ns ≠ 0; (forward) from specification set-basic[nat-set]%ne-01: ⊦ n ∈ ns → ns ≠ ∅; (forward) from specification set-basic[nat-set]%⊦ # buf = # buf0 → (buf + buf1 = buf0 + buf2 ↔ buf = buf0 ∧ buf1 = buf2); (ws)%⊦ buf0 + buf1 = buf2 + buf3 ∧ is-encoded(n, buf0) → (is-encoded(n0, buf2) ↔ # buf0 = # buf2 ∧ n = n0); (ws)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]