PreMonoidalCategories: remove the very last [[admit]]
[coq-categories.git] / src / MonoidalCategories_ch7_8.v
1 Generalizable All Variables.
2 Require Import Preamble.
3 Require Import Categories_ch1_3.
4 Require Import Functors_ch1_4.
5 Require Import Isomorphisms_ch1_5.
6 Require Import InitialTerminal_ch2_2.
7 Require Import Subcategories_ch7_1.
8 Require Import ProductCategories_ch1_6_1.
9 Require Import NaturalTransformations_ch7_4.
10 Require Import NaturalIsomorphisms_ch7_5.
11 Require Import Coherence_ch7_8.
12 Require Import BinoidalCategories.
13 Require Import PreMonoidalCategories.
14
15 (******************************************************************************)
16 (* Chapter 7.8: Monoidal Categories                                           *)
17 (******************************************************************************)
18
19 (* TO DO: show that the endofunctors on any given category form a monoidal category *)
20
21 (*
22  * Unlike Awodey, I define a monoidal category to be a premonoidal
23  * category in which all morphisms are central.  This is partly to
24  * have a clean inheritance hierarchy, but also because Coq bogs down
25  * on product categories for some inexplicable reason.
26  *)
27 Class MonoidalCat `(pm:PreMonoidalCat) :=
28 { mon_pm          := pm
29 ; mon_commutative :> CommutativeCat pm
30 }.
31 Coercion mon_pm          : MonoidalCat >-> PreMonoidalCat.
32 Coercion mon_commutative : MonoidalCat >-> CommutativeCat.
33
34 (* a monoidal functor is just a premonoidal functor between premonoidal categories which happen to be monoidal *)
35 Definition MonoidalFunctor `(m1:MonoidalCat) `(m2:MonoidalCat) := PreMonoidalFunctor m1 m2.
36
37 Definition MonoidalFunctorsCompose
38   `{M1   :MonoidalCat(C:=C1)}
39   `{M2   :MonoidalCat(C:=C2)}
40    {fobj12:C1 -> C2                    }
41    (MF12 :MonoidalFunctor M1 M2 fobj12)
42   `{M3   :MonoidalCat(C:=C3)}
43    {fobj23:C2 -> C3                    }
44    (MF23 :MonoidalFunctor M2 M3 fobj23)
45    : MonoidalFunctor M1 M3 (fobj23 ○ fobj12).
46    apply PreMonoidalFunctorsCompose.
47    apply MF12.
48    apply MF23.
49    Defined.
50
51 Section BinoidalCat_from_Bifunctor.
52   Context `{C:Category}{Fobj}(F:Functor (C ×× C) C Fobj).
53   Definition BinoidalCat_from_Bifunctor_first (a:C) : Functor C C (fun b => Fobj (pair_obj b a)).
54   apply Build_Functor with (fmor:=(fun a0 b (f:a0~~{C}~~>b) =>
55     @fmor _ _ _ _ _ _ _ F (pair_obj a0 a) (pair_obj b a) (pair_mor (pair_obj a0 a) (pair_obj b a) f (id a)))); intros; simpl;
56     [ abstract (set (fmor_respects(F)) as q; apply q; split; simpl; auto)
57     | abstract (set (fmor_preserves_id(F)) as q; apply q)
58     | abstract (etransitivity; 
59       [ set (@fmor_preserves_comp _ _ _ _ _ _ _ F) as q; apply q
60       | set (fmor_respects(F)) as q; apply q ];
61       split; simpl; auto) ].
62   Defined.
63   Definition BinoidalCat_from_Bifunctor_second (a:C) : Functor C C (fun b => Fobj (pair_obj a b)).
64   apply Build_Functor with (fmor:=(fun a0 b (f:a0~~{C}~~>b) =>
65     @fmor _ _ _ _ _ _ _ F (pair_obj a a0) (pair_obj a b) (pair_mor (pair_obj a a0) (pair_obj a b) (id a) f))); intros;
66     [ abstract (set (fmor_respects(F)) as q; apply q; split; simpl; auto)
67     | abstract (set (fmor_preserves_id(F)) as q; apply q)
68     | abstract (etransitivity; 
69       [ set (@fmor_preserves_comp _ _ _ _ _ _ _ F) as q; apply q
70       | set (fmor_respects(F)) as q; apply q ];
71       split; simpl; auto) ].
72   Defined.
73
74   Definition BinoidalCat_from_Bifunctor : BinoidalCat C (fun a b => Fobj (pair_obj a b)).
75    refine {| bin_first  := BinoidalCat_from_Bifunctor_first
76            ; bin_second := BinoidalCat_from_Bifunctor_second
77           |}.
78    Defined.
79
80   Lemma Bifunctors_Create_Commutative_Binoidal_Categories : CommutativeCat BinoidalCat_from_Bifunctor.
81   abstract (intros; apply Build_CommutativeCat; intros; apply Build_CentralMorphism; intros; simpl; (
82     etransitivity; [ apply (fmor_preserves_comp(F)) | idtac ]; symmetry;
83     etransitivity; [ apply (fmor_preserves_comp(F)) | idtac ];
84     apply (fmor_respects(F));
85     split;
86       [ etransitivity; [ apply left_identity | symmetry; apply right_identity ]
87       | etransitivity; [ apply right_identity | symmetry; apply left_identity ] ])).
88   Defined.
89
90   (* if this binoidal structure has all of the natural isomorphisms of a premonoidal category, then it's monoidal *)
91   Context {pmI}(pm:PreMonoidalCat BinoidalCat_from_Bifunctor pmI).
92
93   Instance PreMonoidalCat_from_bifunctor_is_Monoidal : MonoidalCat pm :=
94   { mon_commutative := Bifunctors_Create_Commutative_Binoidal_Categories
95   }.
96
97 End BinoidalCat_from_Bifunctor.
98
99
100 (* we can go the other way: given a monoidal category, its left/right functors can be combined into a bifunctor *)
101 Section Bifunctor_from_MonoidalCat.
102   Context `(M:MonoidalCat).
103
104
105   Definition Bifunctor_from_MonoidalCat_fobj : M ×× M -> M.
106     intro x.
107     destruct x.
108     exact (bin_obj' o o0).
109     Defined.
110
111   Definition Bifunctor_from_MonoidalCat_fmor {a}{b}(f:a~~{M××M}~~>b)
112     : (Bifunctor_from_MonoidalCat_fobj a)~~{M}~~>(Bifunctor_from_MonoidalCat_fobj b).
113     destruct a; destruct b; destruct f.
114     simpl in *.
115     apply (h ⋉ _ >>> _ ⋊ h0).
116     Defined.
117
118   Instance Bifunctor_from_MonoidalCat : Functor (M ×× M) M Bifunctor_from_MonoidalCat_fobj :=
119     { fmor := fun x y f => Bifunctor_from_MonoidalCat_fmor f }.
120     intros; simpl.
121     destruct a; destruct b; destruct f; destruct f'; simpl in *.
122     destruct H.
123     apply comp_respects.
124       apply (fmor_respects (-⋉o0)); auto.
125       apply (fmor_respects (o1⋊-)); auto.
126     intros; destruct a; simpl in *.
127       setoid_rewrite (fmor_preserves_id (-⋉o0)).
128       setoid_rewrite left_identity.
129       apply fmor_preserves_id.
130     intros; destruct a; destruct b; destruct c; destruct f; destruct g; simpl in *.
131       setoid_rewrite <- fmor_preserves_comp.
132       setoid_rewrite juggle3 at 1.
133       assert (CentralMorphism h1).
134         apply mon_commutative.
135       setoid_rewrite <- (centralmor_first(CentralMorphism:=H)).
136       setoid_rewrite <- juggle3.
137       reflexivity.
138       Defined.
139
140 End Bifunctor_from_MonoidalCat.
141
142
143 Class DiagonalCat `(mc:MonoidalCat) :=
144 { copy          :  forall (a:mc),   a~~{mc}~~>(bin_obj(BinoidalCat:=mc) a a)
145 ; copy_natural1 :  forall {a}{b}(f:a~~{mc}~~>b)(c:mc), copy _ >>> f ⋉ a >>> b ⋊ f ~~ f >>> copy _
146 ; copy_natural2 :  forall {a}{b}(f:a~~{mc}~~>b)(c:mc), copy _ >>> a ⋊ f >>> f ⋉ b ~~ f >>> copy _
147 (* for non-cartesian braided diagonal categories we also need: copy >> swap == copy *)
148 }.
149
150 Class CartesianCat `(mc:MonoidalCat) :=
151 { car_terminal  :> TerminalObject mc pmon_I
152 ; car_diagonal  :  DiagonalCat mc
153 ; car_law1      :  forall {a}, id a ~~ (copy(DiagonalCat:=car_diagonal) a) >>> (drop a  ⋉ a) >>> (#(pmon_cancell _))
154 ; car_law2      :  forall {a}, id a ~~ (copy(DiagonalCat:=car_diagonal) a) >>> (a ⋊ drop  a) >>> (#(pmon_cancelr _))
155 ; car_mn        := mc
156 }.
157 Coercion car_diagonal : CartesianCat >-> DiagonalCat.
158 Coercion car_terminal : CartesianCat >-> TerminalObject.
159 Coercion car_mn       : CartesianCat >-> MonoidalCat.