mirror of
https://github.com/kmc7468/cs220.git
synced 2025-12-12 21:08:45 +00:00
- assignment05/pascal.mlw: lowered the difficulty (one more invariant given) - assignment02, 03: minor fixes & divide into sub-problems
37 lines
588 B
Plaintext
37 lines
588 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 |