Library ConCaT.CATEGORY_THEORY.LIMIT_CONSTRUCTIONS.Comma_Complete



Require Export Pres_Limits.
Require Export Comma_proj.

Set Implicit Arguments.
Unset Strict Implicit.

Section comma_complete.

Variables (X A : Category) (G : Functor A X) (J : Category).

Hypothesis A_comp_for_J : forall F : Functor J A, Limit F.
Hypothesis G_pres_JA : forall F : Functor J A, Preserves_limits F G.

Variables (x : X) (F : Functor J (Comma G x)).

Let F' := F o_F Comma_proj G x.

Let l_F' := A_comp_for_J F'.

Let l_GF' := G_pres_JA l_F'.


Definition Tc_tau (i : J) := Mor_com_ob (F i).

Lemma Tc_tau_cone_law : Cone_law (F:=F' o_F G) Tc_tau.
Proof.
unfold Cone_law in |- *; intros i j g.
apply (Prf_com_law (FMor F g)).
Qed.

Definition Tc_cone := Build_Cone Tc_tau_cone_law.


Canonical Structure Tc_limF := Build_Com_ob (Lim_diese l_GF' Tc_cone).


Lemma Tc_limconeF_tau_com_law :
 forall i : J, Com_law (axf:=Tc_limF) (bxg:=F i) (Limiting_cone l_F' i).
Proof.
unfold Com_law in |- *; intro i.
apply Sym; exact (Prf_limit1 l_GF' Tc_cone i).
Qed.

Canonical Structure Tc_limconeF_tau (i : J) :=
  Build_Com_arrow (Tc_limconeF_tau_com_law i).

Lemma Tc_limconeF_cone_law : Cone_law Tc_limconeF_tau.
Proof.
unfold Cone_law in |- *; simpl in |- *.
intros i j g.
unfold Equal_com_arrow in |- *; simpl in |- *.
unfold Comp_com_mor in |- *; simpl in |- *.
apply (Eq_cone (Limiting_cone l_F') g).
Qed.

Definition Tc_limconeF := Build_Cone Tc_limconeF_cone_law.


 Section ctdiese.

 Variables (axf : Comma G x) (t : Cone axf F).

 Definition Tc_t_tau (i : J) := Mor_com_arrow (t i).

 Lemma Tc_t_tau_cone_law : Cone_law (c:=Ob_com_ob axf) (F:=F') Tc_t_tau.
 Proof.
 unfold Cone_law in |- *; intros i j g.
 generalize (Eq_cone t g).
 intro H.
 apply Trans with (FMor (Comma_proj G x) (t i o FMor F g)).
 exact (Pres (FMap (Comma_proj G x) axf (F j)) H).
 exact (Prf_Fcomp_law (Comma_proj G x) (t i) (FMor F g)).
 Qed.

 Definition Tc_t_cone := Build_Cone Tc_t_tau_cone_law.

 Lemma Tc_t_cone_com_law :
  Com_law (axf:=axf) (bxg:=Tc_limF) (Lim_diese l_F' Tc_t_cone).
 Proof.
 unfold Com_law in |- *; unfold Mor_com_ob at 1 in |- *; simpl in |- *.
 apply Sym; apply (Prf_limit2 l_GF').
 unfold Limit_eq in |- *; simpl in |- *; intro i.
 apply
  Trans
   with
     (Mor_com_ob axf
      o FMor G (Lim_diese l_F' Tc_t_cone) o FMor G (Limiting_cone l_F' i)).
 apply Ass1.
 apply Trans with (Mor_com_ob axf o FMor G (Tc_t_tau i)).
 apply Comp_l.
 apply Trans with (FMor G (Lim_diese l_F' Tc_t_cone o Limiting_cone l_F' i)).
 apply FComp1.
 unfold FMor in |- *; apply (Pres (FMap G (Ob_com_ob axf) (Ob_com_ob (F i)))).
 apply (Prf_limit1 l_F' Tc_t_cone i).
 apply Sym; apply (Prf_com_law (t i)).
 Qed.

 Canonical Structure Tc_diese := Build_Com_arrow Tc_t_cone_com_law.

 End ctdiese.

Lemma Tc_UA_law1 : Limit_law1 Tc_limconeF Tc_diese.
Proof.
unfold Limit_law1, Limit_eq in |- *; intros axf t.
intro i; apply (Prf_limit1 l_F' (Tc_t_cone t) i).
Qed.

Lemma Tc_UA_law2 : Limit_law2 Tc_limconeF Tc_diese.
Proof.
unfold Limit_law2, Limit_eq in |- *; intros axf t g.
intro H; unfold Tc_diese in |- *; simpl in |- *;
 unfold Equal_com_arrow in |- *; simpl in |- *.
apply (Prf_limit2 l_F').
exact H.
Qed.

Definition Comma_l_F := Build_IsLimit Tc_UA_law1 Tc_UA_law2.

Definition Comma_l_F1 := Build_Limit Comma_l_F.

End comma_complete.

Lemma Comma_complete :
 forall (X A : Category) (G : Functor A X),
 Complete A -> Continuous G -> forall x : X, Complete (Comma G x).
Proof.
intros X A G cA cG x.
unfold Complete in |- *; intros J F.
exact (Comma_l_F1 (cA J) (cG J) F).
Defined.