(* Factorial function *)
Definition e_fac : expr :=
r_fix (Lam
(e_if (isZ (Var 0))
(* base case *)
(Nat 1)
(* recursive case *)
(App (App (bin_primop mult) (Var 1))
(App (Var 2) (App (unary_primop Peano.pred) (Var 1)))))).

(* Specifications: *)
Lemma e_fac_typ :
Typ nil e_fac (ty_lam ty_nat ty_nat).