| ∃ v0, buf0, buf1, buf2. v0 ∈ vtbl0[v, n] ∧ buf = buf0 + buf1 + buf2 ∧ is-encoded(v0, buf0) ∧ is-encoded(vtbl0[v, n][v0], buf1) ∧ is-encoded-rec(vtbl0[v, n] -- v0, buf2), ∀ vtbl1, buf. # vtbl1 < # vtbl0[v, n] → is-encoded-rec(vtbl1, buf) → # buf = # vtbl1 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ⊦ # buf = (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) * # vtbl0 + ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE, vtbl0[v, n] = ∅, v ∈ vtbl0 |
# buf1 = ENCODED_NAT_SIZE, # buf2 = ENCODED_VOLID_SIZE, is-encoded(v0, buf2), is-encoded(vtbl0[v, n][v0], buf1), is-encoded-rec(vtbl0[v, n] -- v0, buf0), v0 ∈ vtbl0[v, n], ∀ vtbl1, buf. # vtbl1 < # vtbl0[v, n] → is-encoded-rec(vtbl1, buf) → # buf = # vtbl1 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ⊦ # buf0 = (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) * # vtbl0, v ∈ vtbl0
Used simplifier rules: c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ m + n = m + n0 ↔ n = n0; (s)%is-encoded-size: ⊦ is-encoded(v, buf) → # buf = ENCODED_VOLID_SIZE; (forward) from specification encoding-fixed-size[encoding-volid]%is-encoded-size: ⊦ is-encoded(n, buf) → # buf = ENCODED_NAT_SIZE; (forward) from specification encoding-fixed-size[encoding-nat]%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[encoding-nat-buffer]% ⊦ #(buf + buf0) = # buf + # buf0; (s)% ⊦ vtbl[v, n] ≠ ∅; (s)