(*************************************************************************)
(*                                                                       *)
(* Lecture 3                                                             *)
(*                                                                       *)
(*************************************************************************)
(** Next, we import the definitions of the simply-typed lambda calculus. *)
(** And some auxiliary lemmas about these definitions. *)
(* This file draws heavily on the generated lemmas in Stlc.Lemmas. *)
(*************************************************************)
(*   Connection to nominal representation of terms           *)
(*************************************************************)
(* A named representation of STLC terms. No debruijn indices, and binders include the names of free variables. *)
Inductive n_exp : Set :=
| n_var (x:var)
| n_abs (x:var) (e:n_exp)
| n_app (e1:n_exp) (e2:n_exp).
Parameter X : var.
Parameter Y : var.
Parameter neqXY : X <> Y.
Definition example_X : n_exp := n_abs X (n_var X).
Definition example_Y : n_exp := n_abs Y (n_var Y).

(* Specifications: *)
Lemma names_matter : example_X <> example_Y.
Inductive nom_env : Set :=
| nom_nil  : nom_env
| nom_cons : atom -> n_exp -> nom_env -> nom_env -> nom_env.