| inv(buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)), 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)) .len = n→i(# (tolist(buf, i→n(buf .len)) + a ')) ∧ tolist(buf, i→n(buf .len)) + a ' = tolist (buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len), i→n((buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)) .len)) |
⊦ inv(buf) → # tolist(buf, n) = n
⊦ inv(buf) → tolist(buf, n + 1) = push(tolist(buf, n), (buf .data)[(i→n(buf .first) + n) % i→n(buf .size)])
inv(buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len)), 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, tolist(buf, i→n(buf .len)) + a ' = tolist(buf .data:= (buf .data)[i→n((buf .first + buf .len) % buf .size), a] .len:= (1 + buf .len), i→n(buf .len)) + ((buf .data)[i→n((buf .first + buf .len) % buf .size), a][(i→n(buf .first) + i→n(buf .len)) % i→n(buf .size)]) '
[[CONCRETESIMPRULES : ([CSIMPSEQ : ⊦ push(x0, a) = x0 + a '], [CSIMPSEQ : ⊦ (buf .data:= ar) .size = buf .size], [CSIMPSEQ : ⊦ (buf .len:= i1) .size = buf .size], [CSIMPSEQ : ⊦ (buf .data:= ar) .first = buf .first], [CSIMPSEQ : ⊦ (buf .len:= i1) .first = buf .first], [CSIMPSEQ : ⊦ (buf .data:= ar) .data = ar], [CSIMPSEQ : ⊦ (buf .len:= i1) .data = buf .data], [CSIMPSEQ : ⊦ 0 ≤ i → i→n(i + 1) = i→n(i) + 1], [CSIMPSEQ : ⊦ i + j = j + i], [CSIMPSEQ : ⊦ i + j + i0 = (i + j) + i0], [CSIMPSEQ : ⊦ i + j = i + i0 ↔ j = i0], [CSIMPSEQ : ⊦ m + n = n + m], [CSIMPSEQ : ⊦ (m + n0) + n1 = m + n0 + n1], [CSIMPSEQ : ⊦ 0 ≤ i → n→i(i→n(i)) = i], [CSIMPSEQ : ⊦ n→i(m + n) = n→i(m) + n→i(n)], [CSIMPSEQ : ⊦ (x0 + x1) + x2 = x0 + x1 + x2], [CSIMPSEQ : ⊦ # a ' = 0 +1], [CSIMPSEQ : ⊦ # (x0 + x1) = # x0 + # x1], [CSIMPSEQ : ⊦ (buf .len:= i1) .len = i1])]]