Instance CompSpecs : compspecs. make_compspecs prog. Defined.
Definition Vprog : varspecs. mk_varspecs prog. Defined.
Fixpoint fib_of_nat (n: nat): Z :=
match n with
| O => 0
| S n' =>
match n' with
| O => 1
| S n'' => fib_of_nat n'' + fib_of_nat n'
end
end.
Definition fib_of_Z (n: Z): Z := fib_of_nat (nat_of_Z n).

(* Specifications: *)
Theorem fib_0: fib_of_Z 0 = 0.
Lemma fib_nonneg: forall n, 0 <= fib_of_Z n.
Lemma fib_ordered: forall n, 0 <= n -> fib_of_Z n <= fib_of_Z (n + 1).
Lemma fib_bound: forall n, 0 <= n < 46 -> 0 <= fib_of_Z n < Int.max_signed.
Definition fib_spec fun_id :=
DECLARE fun_id
WITH n : Z
PRE  [ _n OF tint ]
PROP (0 <= n < 45) (* 50th term is too large to be a 32bit int *)
LOCAL (temp _n (Vint (Int.repr n)))
SEP ()
POST [ tint ]
PROP () LOCAL (temp ret_temp (Vint (Int.repr (fib_of_Z n))))
SEP ().