Hint Extern 1 (lc_exp (abs _)) =>
  let x1 := fresh in
  pick_fresh x1;
  apply (lc_abs_exists x1).

(* Specifications: *)
Lemma lc_body_exp_wrt_exp : forall e1 e2, body_exp_wrt_exp e1 -> lc_exp e2 -> lc_exp (open_exp_wrt_exp e1 e2).
Lemma lc_body_abs_1 : forall e1, lc_exp (abs e1) -> body_exp_wrt_exp e1.
Lemma lc_exp_unique_mutual : (forall e1 (proof2 proof3 : lc_exp e1), proof2 = proof3).
Lemma lc_exp_unique : forall e1 (proof2 proof3 : lc_exp e1), proof2 = proof3.
Lemma lc_exp_of_lc_set_exp_mutual : (forall e1, lc_set_exp e1 -> lc_exp e1).
Lemma lc_exp_of_lc_set_exp : forall e1, lc_set_exp e1 -> lc_exp e1.
Lemma lc_set_exp_of_lc_exp_size_mutual : forall i1, (forall e1, size_exp e1 = i1 -> lc_exp e1 -> lc_set_exp e1).
Lemma lc_set_exp_of_lc_exp : forall e1, lc_exp e1 -> lc_set_exp e1.
Lemma open_exp_wrt_exp_rec_degree_exp_wrt_exp_mutual : (forall e2 e1 n1, degree_exp_wrt_exp n1 e2 -> open_exp_wrt_exp_rec n1 e1 e2 = e2).
Lemma open_exp_wrt_exp_rec_degree_exp_wrt_exp : forall e2 e1 n1, degree_exp_wrt_exp n1 e2 -> open_exp_wrt_exp_rec n1 e1 e2 = e2.
Lemma open_exp_wrt_exp_lc_exp : forall e2 e1, lc_exp e2 -> open_exp_wrt_exp e2 e1 = e2.
Lemma subst_exp_degree_exp_wrt_exp_mutual : (forall e1 e2 x1 n1, degree_exp_wrt_exp n1 e1 -> degree_exp_wrt_exp n1 e2 -> degree_exp_wrt_exp n1 (subst_exp e2 x1 e1)).
Lemma subst_exp_degree_exp_wrt_exp : forall e1 e2 x1 n1, degree_exp_wrt_exp n1 e1 -> degree_exp_wrt_exp n1 e2 -> degree_exp_wrt_exp n1 (subst_exp e2 x1 e1).
Lemma subst_exp_lc_exp : forall e1 e2 x1, lc_exp e1 -> lc_exp e2 -> lc_exp (subst_exp e2 x1 e1).
Lemma subst_exp_open_exp_wrt_exp_rec_mutual : (forall e3 e1 e2 x1 n1, lc_exp e1 -> subst_exp e1 x1 (open_exp_wrt_exp_rec n1 e2 e3) = open_exp_wrt_exp_rec n1 (subst_exp e1 x1 e2) (subst_exp e1 x1 e3)).
Lemma subst_exp_open_exp_wrt_exp_rec : forall e3 e1 e2 x1 n1, lc_exp e1 -> subst_exp e1 x1 (open_exp_wrt_exp_rec n1 e2 e3) = open_exp_wrt_exp_rec n1 (subst_exp e1 x1 e2) (subst_exp e1 x1 e3).
Lemma subst_exp_open_exp_wrt_exp : forall e3 e1 e2 x1, lc_exp e1 -> subst_exp e1 x1 (open_exp_wrt_exp e3 e2) = open_exp_wrt_exp (subst_exp e1 x1 e3) (subst_exp e1 x1 e2).
Lemma subst_exp_open_exp_wrt_exp_var : forall e2 e1 x1 x2, x1 <> x2 -> lc_exp e1 -> open_exp_wrt_exp (subst_exp e1 x1 e2) (var_f x2) = subst_exp e1 x1 (open_exp_wrt_exp e2 (var_f x2)).
Lemma subst_exp_spec_rec_mutual : (forall e1 e2 x1 n1, subst_exp e2 x1 e1 = open_exp_wrt_exp_rec n1 e2 (close_exp_wrt_exp_rec n1 x1 e1)).
Lemma subst_exp_spec_rec : forall e1 e2 x1 n1, subst_exp e2 x1 e1 = open_exp_wrt_exp_rec n1 e2 (close_exp_wrt_exp_rec n1 x1 e1).
Lemma subst_exp_spec : forall e1 e2 x1, subst_exp e2 x1 e1 = open_exp_wrt_exp (close_exp_wrt_exp x1 e1) e2.
Lemma lc_body_exp_wrt_exp : forall e1 e2, body_exp_wrt_exp e1 -> lc_exp e2 -> lc_exp (open_exp_wrt_exp e1 e2).
Lemma lc_body_abs_1 : forall e1, lc_exp (abs e1) -> body_exp_wrt_exp e1.
Lemma open_exp_wrt_exp_rec_degree_exp_wrt_exp_mutual : (forall e2 e1 n1, degree_exp_wrt_exp n1 e2 -> open_exp_wrt_exp_rec n1 e1 e2 = e2).
Lemma open_exp_wrt_exp_rec_degree_exp_wrt_exp : forall e2 e1 n1, degree_exp_wrt_exp n1 e2 -> open_exp_wrt_exp_rec n1 e1 e2 = e2.
Lemma open_exp_wrt_exp_lc_exp : forall e2 e1, lc_exp e2 -> open_exp_wrt_exp e2 e1 = e2.
Lemma subst_exp_degree_exp_wrt_exp_mutual : (forall e1 e2 x1 n1, degree_exp_wrt_exp n1 e1 -> degree_exp_wrt_exp n1 e2 -> degree_exp_wrt_exp n1 (subst_exp e2 x1 e1)).
Lemma subst_exp_degree_exp_wrt_exp : forall e1 e2 x1 n1, degree_exp_wrt_exp n1 e1 -> degree_exp_wrt_exp n1 e2 -> degree_exp_wrt_exp n1 (subst_exp e2 x1 e1).
Lemma subst_exp_lc_exp : forall e1 e2 x1, lc_exp e1 -> lc_exp e2 -> lc_exp (subst_exp e2 x1 e1).
Lemma subst_exp_open_exp_wrt_exp_rec_mutual : (forall e3 e1 e2 x1 n1, lc_exp e1 -> subst_exp e1 x1 (open_exp_wrt_exp_rec n1 e2 e3) = open_exp_wrt_exp_rec n1 (subst_exp e1 x1 e2) (subst_exp e1 x1 e3)).
Lemma subst_exp_open_exp_wrt_exp_rec : forall e3 e1 e2 x1 n1, lc_exp e1 -> subst_exp e1 x1 (open_exp_wrt_exp_rec n1 e2 e3) = open_exp_wrt_exp_rec n1 (subst_exp e1 x1 e2) (subst_exp e1 x1 e3).
Lemma subst_exp_open_exp_wrt_exp : forall e3 e1 e2 x1, lc_exp e1 -> subst_exp e1 x1 (open_exp_wrt_exp e3 e2) = open_exp_wrt_exp (subst_exp e1 x1 e3) (subst_exp e1 x1 e2).
Lemma subst_exp_open_exp_wrt_exp_var : forall e2 e1 x1 x2, x1 <> x2 -> lc_exp e1 -> open_exp_wrt_exp (subst_exp e1 x1 e2) (var_f x2) = subst_exp e1 x1 (open_exp_wrt_exp e2 (var_f x2)).
Lemma subst_exp_spec_rec_mutual : (forall e1 e2 x1 n1, subst_exp e2 x1 e1 = open_exp_wrt_exp_rec n1 e2 (close_exp_wrt_exp_rec n1 x1 e1)).
Lemma subst_exp_spec_rec : forall e1 e2 x1 n1, subst_exp e2 x1 e1 = open_exp_wrt_exp_rec n1 e2 (close_exp_wrt_exp_rec n1 x1 e1).
Lemma subst_exp_spec : forall e1 e2 x1, subst_exp e2 x1 e1 = open_exp_wrt_exp (close_exp_wrt_exp x1 e1) e2.