blob: 9fb5e0ea3c69f43905e496b03c58d78d3634322e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
// RUN: %dafny /compile:0 /dprint:"%t.dprint" "%s" > "%t"
// RUN: %diff "%s.expect" "%t"
function Factorial(n: nat): nat
{
if n == 0 then 1 else n * Factorial(n-1)
}
method ComputeFactorial(n: int) returns (u: int)
requires 1 <= n;
ensures u == Factorial(n);
{
var r := 1;
u := 1;
while (r < n)
invariant r <= n;
invariant u == Factorial(r);
{
var v, s := u, 1;
while (s < r + 1)
invariant s <= r + 1;
invariant v == Factorial(r) && u == s * Factorial(r);
{
u := u + v;
s := s + 1;
}
r := r + 1;
}
}
|