(* reduction *)
Definition red_rule := env -> term -> term -> Prop.
Section RuleOper.
Variable R : red_rule.
(* fermetures refl. trans. *)
Definition R_rt : red_rule := fun e : env => clos_refl_trans term (R e).
(* reduction dans l'environnement *)
Inductive red_decl : env -> decl -> decl -> Prop :=
| rd_ax :
forall (e : env) (T U : term), R e T U -> red_decl e (Ax T) (Ax U)
| rd_def :
forall (e : env) (d T U : term),
R e T U -> red_decl e (Def d T) (Def d U).
Inductive R_in_env : env -> env -> Prop :=
| R_env_hd :
forall (e : env) (t u : decl),
red_decl e t u -> R_in_env (t :: e) (u :: e)
| R_env_tl :
forall (e f : env) (t : decl),
R_in_env e f -> R_in_env (t :: e) (t :: f).

(* Specifications: *)
Lemma red_item :
forall (n : nat) (t : decl) (e : env),
item t e n ->
forall f : env,
R_in_env e f ->
item t f n \/
(forall g : env,
trunc (S n) e g ->
ex2 (fun u : decl => red_decl g t u) (fun u : decl => item u f n) /\
trunc (S n) f g).