mirror of
https://github.com/kmc7468/cs220.git
synced 2025-12-14 22:18:46 +00:00
56 lines
989 B
Plaintext
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
|