(* substitution dans un environnement *)

  Inductive sub_in_env (g : env) (d1 : decl) (t : term) :
  nat -> env -> env -> Prop :=
    | sub_O : val_ok d1 t -> sub_in_env g d1 t 0 (d1 :: g) g
    | sub_S :
        forall (e f : env) (n : nat) (d : decl),
        sub_in_env g d1 t n e f ->
        sub_in_env g d1 t (S n) (d :: e) (subst_decl t d n :: f).(* substitution dans un environnement *)

  Inductive sub_in_env (g : env) (d1 : decl) (t : term) :
  nat -> env -> env -> Prop :=
    | sub_O : val_ok d1 t -> sub_in_env g d1 t 0 (d1 :: g) g
    | sub_S :
        forall (e f : env) (n : nat) (d : decl),
        sub_in_env g d1 t n e f ->
        sub_in_env g d1 t (S n) (d :: e) (subst_decl t d n :: f).(* substitution dans un environnement *)

  Inductive sub_in_env (g : env) (d1 : decl) (t : term) :
  nat -> env -> env -> Prop :=
    | sub_O : val_ok d1 t -> sub_in_env g d1 t 0 (d1 :: g) g
    | sub_S :
        forall (e f : env) (n : nat) (d : decl),
        sub_in_env g d1 t n e f ->
        sub_in_env g d1 t (S n) (d :: e) (subst_decl t d n :: f).

Lemma sub_decl_eq_def : forall (m t T : term) (n : nat) (g e f : env), sub_in_env g (Def m T) t n e f -> t = m.