| # buf = # orphans1 * ENCODED_NAT_SIZE, (ENCODED_NAT_SIZE * m2 + ENCODED_NAT_SIZE) + m = # buf, orphans ∩ orphans0 = ∅, is-encoded(orphans1, buf), is-encoded(orphans0, subarray(buf, 0, m)), is-encoded(orphans, subarray(buf, m, ENCODED_NAT_SIZE * m2 + ENCODED_NAT_SIZE)) ⊦ ⟪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) |
⊦ ⟪decode_nat#(n1, buf; n, n0; err)⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → is-encoded(n, subarray(buf, n1, n0)) ∧ n1 + n0 ≤ # buf ∧ n0 = encoding-size(n)))
# buf = # orphans1 * ENCODED_NAT_SIZE, (ENCODED_NAT_SIZE * m2 + ENCODED_NAT_SIZE) + m = # buf, buf0 = buf, n2 = m, orphans ∩ orphans0 = ∅, is-encoded(orphans, subarray(buf, m, ENCODED_NAT_SIZE * m2 + ENCODED_NAT_SIZE)), is-encoded(orphans0, subarray(buf, 0, m)), is-encoded(orphans1, buf) ⊦ [decode_nat#(m, buf; n, m0; err)] ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → is-encoded(n, subarray(buf0, n2, m0)) ∧ n2 + m0 ≤ # buf0 ∧ m0 = encoding-size(n)) → ⟪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))