(* end hide *)
(* begin hide *)

(* Specifications: *)
Lemma size_exp_close_exp_wrt_exp_rec :
forall e1 x1 n1,
size_exp (close_exp_wrt_exp_rec n1 x1 e1) = size_exp e1.
Lemma size_exp_open_exp_wrt_exp_rec :
forall e1 e2 n1,
size_exp e1 <= size_exp (open_exp_wrt_exp_rec n1 e2 e1).
Lemma size_exp_open_exp_wrt_exp_rec_var :
forall e1 x1 n1,
size_exp (open_exp_wrt_exp_rec n1 (var_f x1) e1) = size_exp e1.
Lemma degree_exp_wrt_exp_close_exp_wrt_exp_rec :
forall e1 x1 n1,
degree_exp_wrt_exp n1 e1 ->
degree_exp_wrt_exp (S n1) (close_exp_wrt_exp_rec n1 x1 e1).
Lemma degree_exp_wrt_exp_close_exp_wrt_exp_rec_inv :
forall e1 x1 n1,
degree_exp_wrt_exp (S n1) (close_exp_wrt_exp_rec n1 x1 e1) ->
degree_exp_wrt_exp n1 e1.
Lemma degree_exp_wrt_exp_open_exp_wrt_exp_rec :
forall e1 e2 n1,
degree_exp_wrt_exp (S n1) e1 ->
degree_exp_wrt_exp n1 e2 ->
degree_exp_wrt_exp n1 (open_exp_wrt_exp_rec n1 e2 e1).
Lemma degree_exp_wrt_exp_open_exp_wrt_exp_rec_inv :
forall e1 e2 n1,
degree_exp_wrt_exp n1 (open_exp_wrt_exp_rec n1 e2 e1) ->
degree_exp_wrt_exp (S n1) e1.
Lemma close_exp_wrt_exp_rec_inj :
forall e1 e2 x1 n1,
close_exp_wrt_exp_rec n1 x1 e1 = close_exp_wrt_exp_rec n1 x1 e2 ->
e1 = e2.
Lemma close_exp_wrt_exp_rec_open_exp_wrt_exp_rec :
forall e1 x1 n1,
x1 `notin` fv_exp e1 ->
close_exp_wrt_exp_rec n1 x1 (open_exp_wrt_exp_rec n1 (var_f x1) e1) = e1.
Lemma open_exp_wrt_exp_rec_close_exp_wrt_exp_rec :
forall e1 x1 n1,
open_exp_wrt_exp_rec n1 (var_f x1) (close_exp_wrt_exp_rec n1 x1 e1) = e1.
Lemma open_exp_wrt_exp_rec_inj :
forall e2 e1 x1 n1,
x1 `notin` fv_exp e2 ->
x1 `notin` fv_exp e1 ->
open_exp_wrt_exp_rec n1 (var_f x1) e2 = open_exp_wrt_exp_rec n1 (var_f x1) e1 ->
e2 = e1.
Lemma close_exp_wrt_exp_rec_degree_exp_wrt_exp :
forall e1 x1 n1,
degree_exp_wrt_exp n1 e1 ->
x1 `notin` fv_exp e1 ->
close_exp_wrt_exp_rec n1 x1 e1 = e1.
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 fv_exp_close_exp_wrt_exp_rec :
forall e1 x1 n1,
fv_exp (close_exp_wrt_exp_rec n1 x1 e1) [=] remove x1 (fv_exp e1).
Lemma fv_exp_open_exp_wrt_exp_rec_lower :
forall e1 e2 n1,
fv_exp e1 [<=] fv_exp (open_exp_wrt_exp_rec n1 e2 e1).
Lemma fv_exp_open_exp_wrt_exp_rec_upper :
forall e1 e2 n1,
fv_exp (open_exp_wrt_exp_rec n1 e2 e1) [<=] fv_exp e2 `union` fv_exp e1.
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_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_close_exp_wrt_exp_rec_open_exp_wrt_exp_rec :
forall e2 e1 x1 x2 n1,
x2 `notin` fv_exp e2 ->
x2 `notin` fv_exp e1 ->
x2 <> x1 ->
degree_exp_wrt_exp n1 e1 ->
subst_exp e1 x1 e2 = close_exp_wrt_exp_rec n1 x2 (subst_exp e1 x1 (open_exp_wrt_exp_rec n1 (var_f x2) e2)).
Lemma size_exp_close_exp_wrt_exp_rec :
forall e1 x1 n1,
size_exp (close_exp_wrt_exp_rec n1 x1 e1) = size_exp e1.
Lemma size_exp_open_exp_wrt_exp_rec :
forall e1 e2 n1,
size_exp e1 <= size_exp (open_exp_wrt_exp_rec n1 e2 e1).
Lemma size_exp_open_exp_wrt_exp_rec_var :
forall e1 x1 n1,
size_exp (open_exp_wrt_exp_rec n1 (var_f x1) e1) = size_exp e1.
Lemma degree_exp_wrt_exp_close_exp_wrt_exp_rec :
forall e1 x1 n1,
degree_exp_wrt_exp n1 e1 ->
degree_exp_wrt_exp (S n1) (close_exp_wrt_exp_rec n1 x1 e1).
Lemma degree_exp_wrt_exp_close_exp_wrt_exp_rec_inv :
forall e1 x1 n1,
degree_exp_wrt_exp (S n1) (close_exp_wrt_exp_rec n1 x1 e1) ->
degree_exp_wrt_exp n1 e1.
Lemma degree_exp_wrt_exp_open_exp_wrt_exp_rec :
forall e1 e2 n1,
degree_exp_wrt_exp (S n1) e1 ->
degree_exp_wrt_exp n1 e2 ->
degree_exp_wrt_exp n1 (open_exp_wrt_exp_rec n1 e2 e1).
Lemma degree_exp_wrt_exp_open_exp_wrt_exp_rec_inv :
forall e1 e2 n1,
degree_exp_wrt_exp n1 (open_exp_wrt_exp_rec n1 e2 e1) ->
degree_exp_wrt_exp (S n1) e1.
Lemma close_exp_wrt_exp_rec_inj :
forall e1 e2 x1 n1,
close_exp_wrt_exp_rec n1 x1 e1 = close_exp_wrt_exp_rec n1 x1 e2 ->
e1 = e2.
Lemma close_exp_wrt_exp_rec_open_exp_wrt_exp_rec :
forall e1 x1 n1,
x1 `notin` fv_exp e1 ->
close_exp_wrt_exp_rec n1 x1 (open_exp_wrt_exp_rec n1 (var_f x1) e1) = e1.
Lemma open_exp_wrt_exp_rec_close_exp_wrt_exp_rec :
forall e1 x1 n1,
open_exp_wrt_exp_rec n1 (var_f x1) (close_exp_wrt_exp_rec n1 x1 e1) = e1.
Lemma open_exp_wrt_exp_rec_inj :
forall e2 e1 x1 n1,
x1 `notin` fv_exp e2 ->
x1 `notin` fv_exp e1 ->
open_exp_wrt_exp_rec n1 (var_f x1) e2 = open_exp_wrt_exp_rec n1 (var_f x1) e1 ->
e2 = e1.
Lemma close_exp_wrt_exp_rec_degree_exp_wrt_exp :
forall e1 x1 n1,
degree_exp_wrt_exp n1 e1 ->
x1 `notin` fv_exp e1 ->
close_exp_wrt_exp_rec n1 x1 e1 = e1.
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 fv_exp_close_exp_wrt_exp_rec :
forall e1 x1 n1,
fv_exp (close_exp_wrt_exp_rec n1 x1 e1) [=] remove x1 (fv_exp e1).
Lemma fv_exp_open_exp_wrt_exp_rec_lower :
forall e1 e2 n1,
fv_exp e1 [<=] fv_exp (open_exp_wrt_exp_rec n1 e2 e1).
Lemma fv_exp_open_exp_wrt_exp_rec_upper :
forall e1 e2 n1,
fv_exp (open_exp_wrt_exp_rec n1 e2 e1) [<=] fv_exp e2 `union` fv_exp e1.
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_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_close_exp_wrt_exp_rec_open_exp_wrt_exp_rec :
forall e2 e1 x1 x2 n1,
x2 `notin` fv_exp e2 ->
x2 `notin` fv_exp e1 ->
x2 <> x1 ->
degree_exp_wrt_exp n1 e1 ->
subst_exp e1 x1 e2 = close_exp_wrt_exp_rec n1 x2 (subst_exp e1 x1 (open_exp_wrt_exp_rec n1 (var_f x2) e2)).