Section Context_Closure.
Variable R : red_rule.
Definition red := R_rt (ctxt R).
Definition conv := R_rst (ctxt R).
Hint Unfold red conv: pts.
Proof fun e : env => rt_trans term (ctxt R e).
Proof fun e : env => rst_trans term (ctxt R e).
Proof fun e : env => rst_sym term (ctxt R e).
Proof fun e : env => clos_rt_clos_rst term (ctxt R e).
intros.
apply conv_sym; apply red_conv; auto with pts.
Qed.
intros.
apply red_trans with (Abs A' M).
elim H; simpl in |- *; intros; auto with pts.
apply red_trans with (Abs y M); auto with pts.
elim H0; intros; auto with pts.
apply red_trans with (Abs A' y); auto with pts.
Qed.
intros.
apply red_trans with (App u' v).
elim H; simpl in |- *; intros; auto with pts.
apply red_trans with (App y v); auto with pts.
elim H0; intros; auto with pts.
apply red_trans with (App u' y); auto with pts.
Qed.
intros.
apply red_trans with (Prod A' B).
elim H; simpl in |- *; intros; auto with pts.
apply red_trans with (Prod y B); auto with pts.
elim H0; intros; auto with pts.
apply red_trans with (Prod A' y); auto with pts.
Qed.
intros.
apply conv_trans with (Abs A' M).
elim H; simpl in |- *; intros; auto with pts.
apply conv_trans with (Abs y M); auto with pts.
elim H0; intros; auto with pts.
apply conv_trans with (Abs A' y); auto with pts.
Qed.
intros.
apply conv_trans with (App u' v).
elim H; simpl in |- *; intros; auto with pts.
apply conv_trans with (App y v); auto with pts.
elim H0; intros; auto with pts.
apply conv_trans with (App u' y); auto with pts.
Qed.

Lemma conv_conv_prod :
forall (e : env) (A A' B B' : term),
conv e A A' -> conv (Ax A' :: e) B B' -> conv e (Prod A B) (Prod A' B').