/* Mystery function in C0 */
/* What does this function compute? */
/* How would you prove your conjecture? */

int fib(int n) 
//@requires 0 <= n
{
  if (n == 0) return 0;
  else if (n == 1) return 1;
  else return fib(n-1) + fib(n-2)
}

int f(int n)
//@requires n >= 0
//@ensures \result == fib(n)
{
  int i = 0;
  int a = 0;
  int b = 1;
  while (i < n)
    //@invariant 0 <= i <= n
    //@invariant a == fib(i) && b == fib(i+1)
    {
      b = a + b;
      a = b - a;
      i = i+1;
    }
  //@assert i == n
  return a;
}





















int main(int argc, char* argv[]) {
  if (argc != 2) {
    fprintf(stderr, "usage: %s <n>\n", argv[0]);
    return 1;
  }
  int n = atoi(argv[1]);
  printf("f(%d) = %d\n", n, f(n));
  return 0;
}