| buf0 = buf, n + ENCODED_ELEM_SIZE ≤ # buf ⊦ ⟪encode#(a, n; buf, m; err); if err = ESUCCESS ∧ isempty(buf, n, m) then {debug#("encoding_nonempty: encoding is empty"); err := EINVAL}⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ # buf = # buf0 ∧ subarray(buf, 0, n) = subarray(buf0, 0, n) ∧ subarray(buf, n + ENCODED_ELEM_SIZE, # buf - n + ENCODED_ELEM_SIZE) = subarray(buf0, n + ENCODED_ELEM_SIZE, # buf - n + ENCODED_ELEM_SIZE) ∧ (err = ESUCCESS → is-encoded-nonempty(a, subarray(buf, n, ENCODED_ELEM_SIZE)))) |
n + encoding-size(a) ≤ # buf, buf0 = buf ⊦ ⟪encode#(a, n; buf, n0; err)⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ # buf = # buf0 ∧ subarray(buf, 0, n) = subarray(buf0, 0, n) ∧ subarray(buf, n + encoding-size(a), # buf - n + encoding-size(a)) = subarray(buf0, n + encoding-size(a), # buf - n + encoding-size(a)) ∧ (err = ESUCCESS → is-encoded(a, subarray(buf, n, encoding-size(a))) ∧ n0 = encoding-size(a)))
a0 = a, buf = buf, buf0 = buf, buf1 = buf, n1 = n, n + ENCODED_ELEM_SIZE ≤ # buf, n + encoding-size(a) ≤ # buf ⊦ [encode#(a, n; buf, m; err)] ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ # buf = # buf1 ∧ subarray(buf, 0, n1) = subarray(buf1, 0, n1) ∧ subarray(buf, n1 + encoding-size(a0), # buf - n1 + encoding-size(a0)) = subarray(buf1, n1 + encoding-size(a0), # buf - n1 + encoding-size(a0)) ∧ (err = ESUCCESS → is-encoded(a0, subarray(buf, n1, encoding-size(a0))) ∧ m = encoding-size(a0)) → ⟪if err = ESUCCESS ∧ isempty(buf, n, m) then {debug#("encoding_nonempty: encoding is empty"); err := EINVAL}⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ # buf = # buf0 ∧ subarray(buf, 0, n) = subarray(buf0, 0, n) ∧ subarray(buf, n + ENCODED_ELEM_SIZE, # buf - n + ENCODED_ELEM_SIZE) = subarray(buf0, n + ENCODED_ELEM_SIZE, # buf - n + ENCODED_ELEM_SIZE) ∧ (err = ESUCCESS → is-encoded-nonempty(a, subarray(buf, n, ENCODED_ELEM_SIZE)))))
Used simplifier rules: ⊦ encoding-size(a) = ENCODED_ELEM_SIZE; (s)