| buf0 = buf, m = ENCODED_ELEM_ALIGNMENT, n1 = n ⊦ [decode#(n, buf; a, n0; err)] ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → is-encoded(a, subarray(buf0, n1, n0)) ∧ n1 + n0 ≤ # buf0 ∧ n0 = encoding-size(a)) → ⟪if err = ESUCCESS then {n0 := align↑(n0, m); if ¬ n + n0 ≤ # buf then err := EINVAL}⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → is-encoded-aligned(a, subarray(buf, n, size-aligned(a, ENCODED_ELEM_ALIGNMENT))) ∧ n + size-aligned(a, ENCODED_ELEM_ALIGNMENT) ≤ # buf ∧ n0 = size-aligned(a, ENCODED_ELEM_ALIGNMENT)))) |
⊦ [decode#(n, buf; a, n0; err)] ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → is-encoded(a, subarray(buf, n, encoding-size(a))) ∧ n + encoding-size(a) ≤ # buf ∧ n0 = encoding-size(a)) → ⟪if err = ESUCCESS then {n0 := align↑(n0, ENCODED_ELEM_ALIGNMENT); if ¬ n + n0 ≤ # buf then err := EINVAL}⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → is-encoded-aligned(a, subarray(buf, n, size-aligned(a, ENCODED_ELEM_ALIGNMENT))) ∧ n + size-aligned(a, ENCODED_ELEM_ALIGNMENT) ≤ # buf ∧ n0 = size-aligned(a, ENCODED_ELEM_ALIGNMENT))))