| # buf1 = ENCODED_NAT_SIZE, # buf0 = m * ENCODED_NAT_SIZE, # ns0 = m + 1, m + 1 = # ns1, is-encoded(ns1, buf1 + buf0), is-encoded(ns0 -- n, buf0), is-encoded(n, buf1), n ∈ 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 = ns1, ns0 = ∅ |
⊦ ns ≠ ∅ → (is-encoded(ns, buf) ↔ (∃ n, buf0, buf1. n ∈ ns ∧ buf = buf0 + buf1 ∧ is-encoded(n, buf0) ∧ is-encoded(ns -- n, buf1)))
# 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 = ∅
Used simplifier rules: ⊦ # ∅ = 0; (s)% ⊦ m + n = 0 ↔ m = 0 ∧ n = 0; (ws)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic Used terms: buf1 + buf0, ns1