Files
cs220/assets/why3/exercises/solutions/ex2_fact_sol.mlw
2023-08-25 04:39:12 +00:00

38 lines
589 B
Plaintext

(* Two programs to compute the factorial
*)
module FactRecursive
use int.Int
use int.Fact
let rec fact_rec (n: int) : int
requires { n >= 0 }
ensures { result = fact n }
variant { n }
=
if n = 0 then 1 else n * fact_rec (n - 1)
end
module FactLoop
use int.Int
use int.Fact
let fact_loop (n: int) : int
requires { 0 < n }
ensures { result = fact n }
= let ref m = 0 in
let ref r = 1 in
while m < n do
invariant { 0 <= m <= n /\ r = fact m }
variant { n - m }
m <- m + 1;
r <- r * m
done;
r
end