| 0 ≤ (buf .first + buf .len) % buf .size, (buf .first + buf .len) % buf .size < n→i(# buf .data), 0 < buf .size, 0 ≤ buf .len, inv(buf), buf .len < buf .size ⊦ # buf .data = 0, inv(buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) |
⊦ inv(buf) ↔ buf .size = n→i(# buf .data) ∧ buf .size ≠ 0 ∧ 0 ≤ buf .first ∧ buf .first < buf .size ∧ 0 ≤ buf .len ∧ buf .len ≤ buf .size
0 ≤ (buf .first + buf .len) % buf .size, (buf .first + buf .len) % buf .size < n→i(# buf .data), 0 < buf .size, 0 ≤ buf .len, inv(buf), buf .len < buf .size ⊦ # buf .data = 0, (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .size = n→i(# (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .data) ∧ (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .size ≠ 0 ∧ 0 ≤ (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .first ∧ (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .first < (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .size ∧ 0 ≤ (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .len ∧ (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .len ≤ (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .size
[[CONCRETESIMPRULES : ()], [EXTRATERMS : ( buf .data:= (buf .data)[i→n ( (buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len))]]