(*************************************************************************)
(** ** Forall quantification in [lc_exp].                                *)
(*************************************************************************)
(** Let's look more closely at lc_abs and lc_exp_ind. *)
Check lc_exp_ind.
(** The induction principle for the lc_exp relation is particularly strong in the abs case.  << forall P : exp -> Prop, ... (forall e : exp, (forall x : atom, lc_exp (e ^ x)) -> (forall x : atom, P (e ^ x)) -> P (abs e)) -> ... forall e : exp, lc_exp e -> P e >>  This principle says that to prove that a property holds for an abstraction, we can assume that the property holds for the body of the abstraction, opened with *any* variable that we like.  *)
Check lc_abs.
(** However, on the other hand, when we show that an abstraction is locally closed, we need to show that its body is locally closed, when opened by any variable.  That can sometimes be a problem. *)

(* Specifications: *)
Lemma subst_lc0 : forall (x : var) u e,
lc_exp e ->
lc_exp u ->
lc_exp ([x ~> u] e).