mirror of
https://github.com/kmc7468/cs220.git
synced 2025-12-12 21:08:45 +00:00
38 lines
589 B
Plaintext
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
|