-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfactorial.c
43 lines (38 loc) · 822 Bytes
/
factorial.c
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*@ axiomatic Factorial {
logic integer factorial(integer i);
axiom nil:
factorial(0) == 1;
axiom step:
\forall integer i; i >= 0 ==>
factorial(i) == factorial(i - 1) * i;
lemma non_negative:
\forall integer i; i >= 0 ==>
factorial(i) > 0;
}
*/
#define SPEC_ULONG_MAX 18446744073709551615UL
/*@ requires factorial(i) <= SPEC_ULONG_MAX;
assigns \nothing;
ensures \result == factorial(i);
*/
unsigned long factorial(unsigned i)
{
unsigned long f = 1;
/*@ loop invariant 0 <= i;
loop assigns f, i;
loop variant i;
*/
while (i) {
f *= i--;
}
return f;
}
#ifdef OUT_OF_TASK
#include <stdio.h>
int main(void)
{
printf("res: %lu\n", factorial(10));
printf("res: %lu\n", factorial(20));
return 0;
}
#endif