Files
cs220/assets/why3/ex2_fact.mlw
Jeehoon Kang db7517ffb6 Add why3 files
2022-09-03 23:16:27 +09:00

56 lines
989 B
Plaintext

(* Two programs to compute the factorial
Note: function "fact" from module int.Fact (already imported)
can be used in specifications.
Questions:
1. In module FactRecursive:
a. Prove soundness of function fact_rec.
b. Prove its termination.
2. In module FactLoop:
a. Prove soundness of function fact_loop.
b. Prove its termination.
c. Change the code to use a for loop instead of a while loop.
*)
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