| err = ESUCCESS, n1 = n2, n4 = n3, vtbl2 = ∅, is-encoded(vtbl0, buf), err0 = ESUCCESS → is-encoded(n5, subarray(buf, 0, ENCODED_NAT_SIZE)) ∧ ENCODED_NAT_SIZE ≤ # buf ∧ n3 = ENCODED_NAT_SIZE, err = ESUCCESS → (∃ vtbl1. vtbl ⊥ vtbl1 ∧ # vtbl1 + # vtbl = n5 ∧ # vtbl1 = n1 ∧ # buf ≥ ENCODED_NAT_SIZE + n5 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ∧ n0 = ENCODED_NAT_SIZE + # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ∧ is-encoded(n5, subarray(buf, 0, ENCODED_NAT_SIZE)) ∧ is-encoded-rec(vtbl, subarray(buf, ENCODED_NAT_SIZE, # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE))) ∧ is-encoded-rec(vtbl1, subarray(buf, n0, # vtbl1 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE)))), err0 = ESUCCESS ∨ ⌊err0⌋ , err = ESUCCESS ∨ ⌊err⌋ ⊦ ⟪let v = ?, m = ? in {decode_volid#(n0, buf; v, n; err); if err = ESUCCESS then {n0 := n0 + n; decode_nat#(n0, buf; m, n; err); if err = ESUCCESS then {n0 := n0 + n; vtbl[v] := m}}}; n1 := n1 - 1⟫ ( ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → (∃ vtbl1. vtbl ⊥ vtbl1 ∧ # vtbl1 + # vtbl = n5 ∧ # vtbl1 = n1 ∧ # buf ≥ ENCODED_NAT_SIZE + n5 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ∧ n0 = ENCODED_NAT_SIZE + # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ∧ is-encoded(n5, subarray(buf, 0, ENCODED_NAT_SIZE)) ∧ is-encoded-rec(vtbl, subarray(buf, ENCODED_NAT_SIZE, # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE))) ∧ is-encoded-rec(vtbl1, subarray(buf, n0, # vtbl1 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE)))))) ∧ n1 < n2), n1 = 0 |
vtbl1 ≠ ∅, is-encoded(# vtbl1 + # vtbl, subarray(buf, 0, ENCODED_NAT_SIZE)), is-encoded(vtbl0, buf), is-encoded-rec (vtbl1, subarray(buf, ENCODED_NAT_SIZE + # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE), # vtbl1 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE))), is-encoded-rec(vtbl, subarray(buf, ENCODED_NAT_SIZE, # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE))), ENCODED_NAT_SIZE + (# vtbl1 + # vtbl) * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ≤ # buf, vtbl ⊥ vtbl1, err0 = ESUCCESS → ENCODED_NAT_SIZE ≤ # buf ∧ n3 = ENCODED_NAT_SIZE, err0 = ESUCCESS ∨ ⌊err0⌋ ⊦ ⟪let v = ?, m = ? in {decode_volid#(ENCODED_NAT_SIZE + # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE), buf; v, n; err); n0 := ENCODED_NAT_SIZE + # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE); n5 := # vtbl1 + # vtbl; if err = ESUCCESS then {n0 := n0 + n; decode_nat#(n0, buf; m, n; err); if err = ESUCCESS then {n0 := n0 + n; vtbl[v] := m}}}; n1 := # vtbl1 - 1⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → (∃ vtbl2. vtbl ⊥ vtbl2 ∧ # vtbl2 + # vtbl = n5 ∧ # vtbl2 = n1 ∧ ENCODED_NAT_SIZE + (# vtbl2 + # vtbl) * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ≤ # buf ∧ n0 = ENCODED_NAT_SIZE + # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE) ∧ is-encoded(# vtbl2 + # vtbl, subarray(buf, 0, ENCODED_NAT_SIZE)) ∧ is-encoded-rec(vtbl, subarray(buf, ENCODED_NAT_SIZE, # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE))) ∧ is-encoded-rec (vtbl2, subarray (buf, ENCODED_NAT_SIZE + # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE), # vtbl2 * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE))))) ∧ n1 < # vtbl1)
Used simplifier rules: is-encoded-rec-size: ⊦ is-encoded-rec(vtbl, buf) → # buf = # vtbl * (ENCODED_VOLID_SIZE + ENCODED_NAT_SIZE);% ⊦ # vtbl = 0 ↔ vtbl = ∅; (s)%mult-c: ⊦ m * n = n * m; from specification nat-mult%mult-a: ⊦ m0 * m * n = (m0 * m) * n; from specification nat-mult% ⊦ m0 ≠ 0 → (m * m0 = n * m0 ↔ m = n); (s)% ⊦ # subarray(buf, m, n) = n; (s)%is-encoded-size: ⊦ is-encoded(n, buf) → # buf = ENCODED_NAT_SIZE; (forward) from specification encoding-fixed-size[encoding-nat]% ⊦ is-encoded(n, buf) → (is-encoded(n0, buf) ↔ n = n0); (s)% ⊦ n ≥ m ↔ m ≤ n; (s)