1 (* Program proofs from Floyd's "Assigning Meanings to Programs" (1967) *)
5 (* computes the sum a[1] + ... + a[n] *)
12 let sum (a: array int) (n: int) : int
13 requires { 0 <= n < a.length }
14 ensures { result = sum a 1 (n+1) }
18 invariant { 1 <= i <= n+1 /\ s = sum a 1 i }
29 (* Quotient and remainder of X div Y
31 Floyd's lexicographic variant is unnecessarily complex here, since
32 we do not seek for a variant which decreases at each statement, but
33 only at each execution of the loop body. *)
38 let division (x: int) (y: int) : (q: int, r: int)
39 requires { 0 <= x /\ 0 < y }
40 ensures { 0 <= r < y /\ x = q * y + r }
44 invariant { 0 <= r /\ x = q * y + r }