(*************************************************************************)
(** * Renaming *)
(*************************************************************************)
(* Substitution and weakening together give us a property we call renaming: (see [typing_c_rename below] that we can change the name of the variable used to open an expression in a typing derivation. In practice, this means that if a variable is not "fresh enough" during a proof, we can use this lemma to rename it to one with additional freshness constraints.  Renaming is used below to show the correspondence between the exists-fresh version of the rules with the cofinite version, and also to show that typechecking is decidable. *)
(* However, before we prove renaming, we need an auxiliary lemma about typing judgments which says that terms are well-typed only in unique environments. *)

Lemma typing_c_uniq : forall E e T,
typing_c E e T -> uniq E.