(* end hide *)

(* Specifications: *)
Lemma size_typ_min :
forall T1, 1 <= size_typ T1.
Lemma size_exp_min :
forall e1, 1 <= size_exp e1.
Lemma degree_exp_wrt_exp_S :
forall n1 e1,
degree_exp_wrt_exp n1 e1 ->
degree_exp_wrt_exp (S n1) e1.
Lemma degree_exp_wrt_exp_of_lc_exp :
forall e1,
lc_exp e1 ->
degree_exp_wrt_exp 0 e1.
Lemma lc_exp_of_degree :
forall e1,
degree_exp_wrt_exp 0 e1 ->
lc_exp e1.
Lemma lc_exp_unique :
forall e1 (proof2 proof3 : lc_exp e1), proof2 = proof3.
Lemma lc_exp_of_lc_set_exp :
forall e1, lc_set_exp e1 -> lc_exp e1.
Lemma lc_set_exp_of_lc_exp :
forall e1,
lc_exp e1 ->
lc_set_exp e1.
Lemma fv_exp_subst_exp_fresh :
forall e1 e2 x1,
x1 `notin` fv_exp e1 ->
fv_exp (subst_exp e2 x1 e1) [=] fv_exp e1.
Lemma fv_exp_subst_exp_lower :
forall e1 e2 x1,
remove x1 (fv_exp e1) [<=] fv_exp (subst_exp e2 x1 e1).
Lemma fv_exp_subst_exp_notin :
forall e1 e2 x1 x2,
x2 `notin` fv_exp e1 ->
x2 `notin` fv_exp e2 ->
x2 `notin` fv_exp (subst_exp e2 x1 e1).
Lemma fv_exp_subst_exp_upper :
forall e1 e2 x1,
fv_exp (subst_exp e2 x1 e1) [<=] fv_exp e2 `union` remove x1 (fv_exp e1).
Lemma subst_exp_close_exp_wrt_exp_rec :
forall e2 e1 x1 x2 n1,
degree_exp_wrt_exp n1 e1 ->
x1 <> x2 ->
x2 `notin` fv_exp e1 ->
subst_exp e1 x1 (close_exp_wrt_exp_rec n1 x2 e2) = close_exp_wrt_exp_rec n1 x2 (subst_exp e1 x1 e2).
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_fresh_eq :
forall e2 e1 x1,
x1 `notin` fv_exp e2 ->
subst_exp e1 x1 e2 = e2.
Lemma subst_exp_fresh_same :
forall e2 e1 x1,
x1 `notin` fv_exp e1 ->
x1 `notin` fv_exp (subst_exp e1 x1 e2).
Lemma subst_exp_fresh :
forall e2 e1 x1 x2,
x1 `notin` fv_exp e2 ->
x1 `notin` fv_exp e1 ->
x1 `notin` fv_exp (subst_exp e1 x2 e2).
Lemma subst_exp_subst_exp :
forall e1 e2 e3 x2 x1,
x2 `notin` fv_exp e2 ->
x2 <> x1 ->
subst_exp e2 x1 (subst_exp e3 x2 e1) = subst_exp (subst_exp e2 x1 e3) x2 (subst_exp e2 x1 e1).
Lemma subst_exp_intro_rec :
forall e1 x1 e2 n1,
x1 `notin` fv_exp e1 ->
open_exp_wrt_exp_rec n1 e2 e1 = subst_exp e2 x1 (open_exp_wrt_exp_rec n1 (var_f x1) e1).
Lemma size_typ_min :
forall T1, 1 <= size_typ T1.
Lemma size_exp_min :
forall e1, 1 <= size_exp e1.
Lemma degree_exp_wrt_exp_S :
forall n1 e1,
degree_exp_wrt_exp n1 e1 ->
degree_exp_wrt_exp (S n1) e1.
Lemma degree_exp_wrt_exp_of_lc_exp :
forall e1,
lc_exp e1 ->
degree_exp_wrt_exp 0 e1.
Lemma lc_exp_of_degree :
forall e1,
degree_exp_wrt_exp 0 e1 ->
lc_exp e1.
Lemma fv_exp_subst_exp_fresh :
forall e1 e2 x1,
x1 `notin` fv_exp e1 ->
fv_exp (subst_exp e2 x1 e1) [=] fv_exp e1.
Lemma fv_exp_subst_exp_lower :
forall e1 e2 x1,
remove x1 (fv_exp e1) [<=] fv_exp (subst_exp e2 x1 e1).
Lemma fv_exp_subst_exp_notin :
forall e1 e2 x1 x2,
x2 `notin` fv_exp e1 ->
x2 `notin` fv_exp e2 ->
x2 `notin` fv_exp (subst_exp e2 x1 e1).
Lemma fv_exp_subst_exp_upper :
forall e1 e2 x1,
fv_exp (subst_exp e2 x1 e1) [<=] fv_exp e2 `union` remove x1 (fv_exp e1).
Lemma subst_exp_close_exp_wrt_exp_rec :
forall e2 e1 x1 x2 n1,
degree_exp_wrt_exp n1 e1 ->
x1 <> x2 ->
x2 `notin` fv_exp e1 ->
subst_exp e1 x1 (close_exp_wrt_exp_rec n1 x2 e2) = close_exp_wrt_exp_rec n1 x2 (subst_exp e1 x1 e2).
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_fresh_eq :
forall e2 e1 x1,
x1 `notin` fv_exp e2 ->
subst_exp e1 x1 e2 = e2.
Lemma subst_exp_fresh_same :
forall e2 e1 x1,
x1 `notin` fv_exp e1 ->
x1 `notin` fv_exp (subst_exp e1 x1 e2).
Lemma subst_exp_fresh :
forall e2 e1 x1 x2,
x1 `notin` fv_exp e2 ->
x1 `notin` fv_exp e1 ->
x1 `notin` fv_exp (subst_exp e1 x2 e2).
Lemma subst_exp_subst_exp :
forall e1 e2 e3 x2 x1,
x2 `notin` fv_exp e2 ->
x2 <> x1 ->
subst_exp e2 x1 (subst_exp e3 x2 e1) = subst_exp (subst_exp e2 x1 e3) x2 (subst_exp e2 x1 e1).