| # buf5 = # buf4, # buf2 = # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE), # buf0 = ENCODED_NAT_SIZE, # buf4 = (# buf2 + # buf3) + ENCODED_NAT_SIZE, # buf = # buf4, n0 = ENCODED_NAT_SIZE + # buf2, subarray(buf5, 0, ENCODED_NAT_SIZE + # buf2) = buf0 + buf2, subarray(buf5, ENCODED_NAT_SIZE + # buf2 + ENCODED_VOLID_SIZE, # buf4 - ENCODED_NAT_SIZE + # buf2 + ENCODED_VOLID_SIZE) = subarray(buf3, ENCODED_VOLID_SIZE, # buf4 - ENCODED_NAT_SIZE + # buf2 + ENCODED_VOLID_SIZE), subarray(buf4, ENCODED_NAT_SIZE, # buf2 + # buf3) = subarray(buf, ENCODED_NAT_SIZE, # buf2 + # buf3), vtbl0 = vtbl1, is-encoded(#(vtbl1 ∪ vtbl), buf0), is-encoded-rec(vtbl, buf2), v ∈ vtbl1, # vtbl1 * (ENCODED_NAT_SIZE + ENCODED_VOLID_SIZE) ≤ # buf3, #(vtbl1 ∪ vtbl) * (ENCODED_NAT_SIZE + ENCODED_VOLID_SIZE) ≤ # buf2 + # buf3, ENCODED_VOLID_SIZE ≤ # buf3, vtbl1 ⊥ vtbl, err = ESUCCESS → is-encoded(v, subarray(buf5, ENCODED_NAT_SIZE + # buf2, ENCODED_VOLID_SIZE)) ∧ n = ENCODED_VOLID_SIZE, err0 = ESUCCESS → is-encoded(#(vtbl1 ∪ vtbl), subarray(buf4, 0, ENCODED_NAT_SIZE)) ∧ n1 = ENCODED_NAT_SIZE, err = ESUCCESS ∨ ⌊err⌋ , err0 = ESUCCESS ∨ ⌊err0⌋ ⊦ ⟪vtbl0 := vtbl0 -- v⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ # buf5 = # buf4 ∧ ( err = ESUCCESS → (∃ buf0, buf2, buf, vtbl3. buf5 = buf0 + buf2 + buf ∧ vtbl1 ∪ vtbl = vtbl0 ∪ vtbl3 ∧ vtbl0 ⊥ vtbl3 ∧ # buf0 + # buf2 = n0 ∧ # vtbl0 * (ENCODED_NAT_SIZE + ENCODED_VOLID_SIZE) ≤ # buf ∧ is-encoded(#(vtbl0 ∪ vtbl3), buf0) ∧ is-encoded-rec(vtbl3, buf2))) ∧ # vtbl0 < # vtbl1), err = ESUCCESS, vtbl1 = ∅, v ∈ vtbl |
Used simplifier rules: ⊦ ⌊err⌋ → err ≠ ESUCCESS; (s)% ⊦ v ∈ vtbl → #(vtbl -- v) = (# vtbl)-1; (s)% ⊦ n -1 = n - 1; (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)% ⊦ m < 1 ↔ m = 0; (s)% ⊦ # vtbl = 0 ↔ vtbl = ∅; (s)%n0 ≤ n ⊦ n - n0 < m ↔ n < m + n0; (s)% ⊦ m < n + 1 ↔ ¬ n < m; (s)% ⊦ ¬ n < n; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic