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.
15 (******************************************************************************)
16 (* Chapter 7.8: Monoidal Categories *)
17 (******************************************************************************)
19 (* TO DO: show that the endofunctors on any given category form a monoidal category *)
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.
27 Class MonoidalCat `(pm:PreMonoidalCat) :=
29 ; mon_commutative :> CommutativeCat pm
31 Coercion mon_pm : MonoidalCat >-> PreMonoidalCat.
32 Coercion mon_commutative : MonoidalCat >-> CommutativeCat.
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.
37 Definition MonoidalFunctorsCompose
38 `{M1 :MonoidalCat(C:=C1)}
39 `{M2 :MonoidalCat(C:=C2)}
41 (MF12 :MonoidalFunctor M1 M2 fobj12)
42 `{M3 :MonoidalCat(C:=C3)}
44 (MF23 :MonoidalFunctor M2 M3 fobj23)
45 : MonoidalFunctor M1 M3 (fobj23 ○ fobj12).
46 apply PreMonoidalFunctorsCompose.
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) ].
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) ].
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
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));
86 [ etransitivity; [ apply left_identity | symmetry; apply right_identity ]
87 | etransitivity; [ apply right_identity | symmetry; apply left_identity ] ])).
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).
93 Instance PreMonoidalCat_from_bifunctor_is_Monoidal : MonoidalCat pm :=
94 { mon_commutative := Bifunctors_Create_Commutative_Binoidal_Categories
97 End BinoidalCat_from_Bifunctor.
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).
105 Definition Bifunctor_from_MonoidalCat_fobj : M ×× M -> M.
108 exact (bin_obj' o o0).
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.
115 apply (h ⋉ _ >>> _ ⋊ h0).
118 Instance Bifunctor_from_MonoidalCat : Functor (M ×× M) M Bifunctor_from_MonoidalCat_fobj :=
119 { fmor := fun x y f => Bifunctor_from_MonoidalCat_fmor f }.
121 destruct a; destruct b; destruct f; destruct f'; simpl in *.
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.
140 End Bifunctor_from_MonoidalCat.
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 *)
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 _))
157 Coercion car_diagonal : CartesianCat >-> DiagonalCat.
158 Coercion car_terminal : CartesianCat >-> TerminalObject.
159 Coercion car_mn : CartesianCat >-> MonoidalCat.