(* Contribution to the Coq Library   V6.3 (July 1999)                    *)
(****************************************************************************)
(*                 The Calculus of Inductive Constructions                  *)
(*                                                                          *)
(*                                Projet Coq                                *)
(*                                                                          *)
(*                     INRIA                        ENS-CNRS                *)
(*              Rocquencourt                        Lyon                    *)
(*                                                                          *)
(*                                Coq V5.10                                 *)
(*                              Nov 25th 1994                               *)
(*                                                                          *)
(****************************************************************************)
(*                                  Pol1.v                                  *)
(****************************************************************************)
(*****************************************************************************)
(*          Projet Coq  - Calculus of Inductive Constructions V5.8           *)
(*****************************************************************************)
(*                                                                           *)
(*      Meta-theory of the explicit substitution calculus lambda-env         *)
(*      Amokrane Saibi                                                       *)
(*                                                                           *)
(*      September 1993                                                       *)
(*                                                                           *)
(*****************************************************************************)
(* Preuve de terminaison: Polynome P1 *)
Definition e_P1 (b : wsort) (U : TS b) : nat :=
(fix F (w : wsort) (t : TS w) {struct t} : nat :=
match t with
| var n => power2 (S n)
| app t0 t1 => F wt t0 + F wt t1
| lambda t0 => F wt t0 + 2
| env t0 t1 => F wt t0 * F ws t1
| id => 2
| shift => 2
| cons t0 t1 => F wt t0 + F ws t1
| comp t0 t1 => F ws t0 * F ws t1
| lift t0 => F ws t0
| meta_X _ => 2
| meta_x _ => 2
end) b U.
(* var *)
(* app *)
(* lam *)
(* env *)
(*  id *)
(*  |  *)
(*  .  *)
(*  o  *)
(*  || *)
(*  X  *)
(*  x  *)
Notation P1 := (e_P1 _) (only parsing).
(* <Warning> : Syntax is discontinued *)

(* Specifications: *)
Theorem gt_P1_1 : forall (b : wsort) (M : TS b), e_P1 _ M > 1.
Hint Resolve gt_P1_1.
Theorem P1_app : forall M N : terms, reg_app M N -> e_P1 _ M = e_P1 _ N.
Hint Resolve P1_app.
Theorem P1_lambda : forall M N : terms, reg_lambda M N -> e_P1 _ M > e_P1 _ N.
Hint Resolve P1_lambda.
Theorem P1_clos : forall M N : terms, reg_clos M N -> e_P1 _ M = e_P1 _ N.
Hint Resolve P1_clos.
Theorem P1_varshift1 :
forall M N : terms, reg_varshift1 M N -> e_P1 _ M = e_P1 _ N.