extern int __VERIFIER_nondet_int(); void abort() { }; int fibo1(int n); int fibo2(int n); /*@ requires (1); ensures ((((((\result == 1) || (n < 1)) || (2 < n)) && (((\result == 0) || (1 < n)) || (n == 1))) && ((((3 == n) || (4 < n)) || (n < 2)) || ((3 == \result) && (n == 4))))); @*/ int fibo1(int n) { if (n < 1) { return 0; } else if (n == 1) { return 1; } else { return fibo2(n-1) + fibo2(n-2); } } /*@ requires (1); ensures ((((((\result == 1) && (n == 1)) || (\result == 0)) || (1 < n)) && (((((\result == 1) && (n == 1)) || (n < 1)) || (3 < n)) || ((\result == 1) && (2 == n))))); @*/ int fibo2(int n) { if (n < 1) { return 0; } else if (n == 1) { return 1; } else { return fibo1(n-1) + fibo1(n-2); } } // fibo 1-30 // 1, 1, 2, 3, 5, // 8, 13, 21, 34, 55, // 89, 144, 233, 377, 610, // 987, 1597, 2584, 4181, 6765, // 10946, 17711, 28657, 46368, 75025, // 121393, 196418, 317811, 514229, 832040 int main() { int x = 4; int result = fibo1(x); if (result != 3) { ERROR: {/*@ assert(0); */;abort();} } return 0; }