| # buf = 0, 0 = # vtbl1 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE), is-encoded-rec(vtbl1, buf), ∀ vtbl, buf, vtbl1. # vtbl < # ∅ → # buf = # vtbl1 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ∧ # buf = # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ∧ is-encoded-rec(vtbl, buf) ∧ is-encoded-rec(vtbl1, buf) → vtbl = vtbl1 ⊦ ∅ = vtbl1 |
vtbl ≠ ∅ ⊦ is-encoded-rec(vtbl, buf) ↔ (∃ v, buf0, buf1, buf2. v ∈ vtbl ∧ buf = buf0 + buf1 + buf2 ∧ is-encoded(v, buf0) ∧ is-encoded(vtbl[v], buf1) ∧ is-encoded-rec(vtbl -- v, buf2))
Used simplifier rules: is-encoded-rec-size: ⊦ is-encoded-rec(vtbl, buf) → # buf = # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE);% ⊦ #(buf + buf0) = # buf + # buf0; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[encoding-nat-buffer]% ⊦ 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%is-encoded-size: ⊦ is-encoded(n, buf) → # buf = ENCODED_NAT_SIZE; (forward) from specification encoding-fixed-size[encoding-nat]%is-encoded-size: ⊦ is-encoded(v, buf) → # buf = ENCODED_VOLID_SIZE; (forward) from specification encoding-fixed-size[encoding-volid]% ⊦ v ∈ vtbl → #(vtbl -- v) = (# vtbl)-1; (s)% ⊦ n -1 = n - 1; (s)% ⊦ ENCODED_VOLID_SIZE ≠ 0; (s) Used terms: buf, vtbl1