| # buf = # orphans1 * ENCODED_NAT_SIZE, m + ENCODED_NAT_SIZE * m2 + ENCODED_NAT_SIZE = # buf, orphans ∩ orphans0 = ∅, is-encoded(orphans1, buf), is-encoded(orphans0, subarray(buf, 0, m)), is-encoded(orphans, subarray(buf, m, # buf - m)) ⊦ ⟪decode_nat#(m, buf; n, m0; err); if err = ESUCCESS then orphans0 := orphans0 ++ n; m := m + ENCODED_NAT_SIZE; m4 := m2⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ m + m4 * ENCODED_NAT_SIZE = # buf ∧ ( err = ESUCCESS → is-encoded(orphans0, subarray(buf, 0, m)) ∧ (∃ orphans. is-encoded(orphans, subarray(buf, m, # buf - m)) ∧ orphans ∩ orphans0 = ∅)) ∧ ¬ m2 < m4) |
# buf = # orphans1 * ENCODED_NAT_SIZE, # buf = n0 + m, m + ENCODED_NAT_SIZE * m2 + ENCODED_NAT_SIZE = # buf, orphans ∩ orphans0 = ∅, is-encoded(orphans, subarray(buf, m, n0)), is-encoded(orphans0, subarray(buf, 0, m)), is-encoded(orphans1, buf), m ≤ # buf ⊦ ⟪decode_nat#(m, buf; n, m0; err); if err = ESUCCESS then orphans0 := orphans0 ++ n; m := m + ENCODED_NAT_SIZE; m4 := m2⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ m + m4 * ENCODED_NAT_SIZE = # buf ∧ ( err = ESUCCESS → is-encoded(orphans0, subarray(buf, 0, m)) ∧ (∃ orphans. is-encoded(orphans, subarray(buf, m, # buf - m)) ∧ orphans ∩ orphans0 = ∅)) ∧ ¬ m2 < m4)
Used simplifier rules: ⊦ m ≠ n → (m ≤ n ↔ m < n); (s)% ⊦ n ≠ n0 → (n < n0 ↔ ¬ n0 < n); (ss)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%lf-02: ⊦ m < n ∧ m = n0 → n0 < n; (forward) from specification nat-basic% ⊦ m < n → n ≠ 0; (s)% ⊦ ¬ m + n < m; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic%# buf = n ⊦ subarray(buf, 0, n) = buf; (s)% ⊦ is-encoded(ns0, buf) → (is-encoded(ns1, buf) ↔ ns0 = ns1); (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)%n ≤ m ⊦ n0 = m - n ↔ m = n0 + n; (elim) Used terms: # buf, m, n0