| buf1 = buf, buf .len < buf .size, inv(buf), 0 ≤ buf .len, 0 < buf .size ⊦ 〈put#((buf .first + buf .len) % buf .size, a; buf1 .data)〉 〈buf1 := buf1 .len:= (buf1 .len + 1)〉 (inv(buf1) ∧ abs(buf1, tolist(buf, i→n(buf .len)) + a ')) |
buf1 = buf, buf .len < buf .size, inv(buf), 0 ≤ buf .len, 0 < buf .size ⊦ 〈ar := buf1 .data, a0 := a, i := (buf .first + buf .len) % buf .size〉 〈if 0 ≤ i ∧ i < n→i(# ar) then ar := ar[i→n(i), a0] else abort〉 〈buf1 := buf1 .data:= ar .len:= ((buf1 .data:= ar) .len + 1)〉 (inv(buf1) ∧ abs(buf1, tolist(buf, i→n(buf .len)) + a '))
[[CONCRETESIMPRULES : ([CSIMPDECL : put# (i, a; ar) { if 0 ≤ i ∧ i < n→i(# ar) then ar := ar[i→n(i), a] else abort }])]]