Library ConCaT.CATEGORY_THEORY.ADJUNCTION.CCC.Cartesian1



Require Export Diagonal.
Require Export CCC.
Require Export Terminal1.

Set Implicit Arguments.
Unset Strict Implicit.


Section diag_hasprod1.

Variable C : Category.

SubClass HasBinProd1 := RightAdj (Diag C).

Structure IsCartesian1 : Type :=
  {Car_terminal1 :> Terminal1 C; Car_BP1 :> HasBinProd1}.

Variable H : HasBinProd1.

 Section diag_prod1.

 Variable a b : C.

 Let ua' := CoUnit H (Build_POb a b).

 Definition Obj_prod1 := CoUA_ob ua'.

 Definition Proj1_prod1 := Hom_l (CoUA_mor ua').

 Definition Proj2_prod1 := Hom_r (CoUA_mor ua').

  Section together1_def.

  Variable c : C.

  Definition Together1 (f : c --> a) (g : c --> b) :=
    CoUA_diese ua' (Build_Pmor (u:=Build_POb c c) (t:=Build_POb a b) f g).

  Lemma Together1_l : Map2_congl_law Together1.
  Proof.
  unfold Map2_congl_law in |- *; intros f g g' H'.
  unfold Together1 in |- ×.
  apply (Codiese_map ua' (a':=c)).
  simpl in |- *; unfold Equal_Pmor in |- *; simpl in |- ×.
  split.
  apply Refl.
  trivial.
  Qed.

  Lemma Together1_r : Map2_congr_law Together1.
  Proof.
  unfold Map2_congr_law in |- *; intros f f' g H'.
  unfold Together1 in |- ×.
  apply (Codiese_map ua' (a':=c)).
  simpl in |- *; unfold Equal_Pmor in |- *; simpl in |- ×.
  split.
  trivial.
  apply Refl.
  Qed.

  Definition Op_together1 := Build_Map2 Together1_l Together1_r.

  End together1_def.

 Lemma Prf_eq1_prod1 : Eq1_prod_law Proj1_prod1 Op_together1.
 Proof.
 unfold Eq1_prod_law in |- *; intros c f g.
 unfold Together_prod, Op_together1, Together1, Proj1_prod1, Ap2 in |- *;
  simpl in |- ×.
 generalize
  (Prf_isCoUA_law1 ua' (Build_Pmor (u:=Build_POb c c) (t:=Build_POb a b) f g)).
 unfold CoUA_eq in |- *; simpl in |- ×.
 unfold Equal_Pmor in |- *; simpl in |- ×.
 simple induction 1.
 intros H2 H3.
 apply H2.
 Qed.

 Lemma Prf_eq2_prod1 : Eq2_prod_law Proj2_prod1 Op_together1.
 Proof.
 unfold Eq2_prod_law in |- *; intros c f g.
 unfold Together_prod, Op_together1, Together1, Proj2_prod1, Ap2 in |- *;
  simpl in |- ×.
 generalize
  (Prf_isCoUA_law1 ua' (Build_Pmor (u:=Build_POb c c) (t:=Build_POb a b) f g)).
 unfold CoUA_eq in |- *; simpl in |- ×.
 unfold Equal_Pmor in |- *; simpl in |- ×.
 simple induction 1.
 intros H2 H3.
 apply H3.
 Qed.

 Lemma Prf_unique_together1 :
  Unique_together_law Proj1_prod1 Proj2_prod1 Op_together1.
 Proof.
 unfold Unique_together_law in |- *; intros c h.
 unfold Together_prod, Ap2 in |- *; simpl in |- *; unfold Together1 in |- ×.
 apply Sym.
 apply
  (Prf_isCoUA_law2 ua'
     (f:=Build_Pmor (u:=Build_POb c c) (t:=Build_POb a b)
           (h o Proj1_prod1) (h o Proj2_prod1)) (g:=h)).
 unfold CoUA_eq in |- *; simpl in |- ×.
 unfold Equal_Pmor in |- *; simpl in |- *; split.
 apply Refl.
 apply Refl.
 Qed.

 End diag_prod1.

 Definition BP1_to_BP : HasBinProd C :=
   fun a b : C
   Build_BinProd (Prf_eq1_prod1 (a:=a) (b:=b)) (Prf_eq2_prod1 (a:=a) (b:=b))
     (Prf_unique_together1 (a:=a) (b:=b)).

End diag_hasprod1.

Coercion BP1_to_BP : HasBinProd1 >-> HasBinProd.

Coercion Car1_to_Car (C : Category) (H : IsCartesian1 C) :=
  Build_IsCartesian H H.