(* 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).

(* Specifications: *)
Lemma nth_sub_sup : forall (t : term) (n : nat) (g e f : env) (d' : decl), sub_in_env g d' t n e f -> forall v : nat, n <= v -> forall d : decl, item d e (S v) -> item d f v.
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.
Lemma nth_sub_eq : forall (t : term) (d1 : decl) (n : nat) (g e f : env), sub_in_env g d1 t n e f -> forall d : decl, item d e n -> d1 = d.
Lemma nth_sub_inf : forall (t : term) (d1 : decl) (n : nat) (g e f : env), sub_in_env g d1 t n e f -> forall v : nat, n > v -> forall d : decl, item d e v -> item (subst_decl t d (n - S v)) f v.
Lemma nth_sub_item_inf : forall (t : term) (d1 : decl) (n : nat) (g e f : env), sub_in_env g d1 t n e f -> forall v : nat, n > v -> forall u : term, item_lift u e v -> item_lift (subst_rec t u n) f v.