PreMonoidalCategories: remove the very last [[admit]]
[coq-categories.git] / src / PreMonoidalCategories.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 EpicMonic_ch2_1.
7 Require Import InitialTerminal_ch2_2.
8 Require Import Subcategories_ch7_1.
9 Require Import NaturalTransformations_ch7_4.
10 Require Import NaturalIsomorphisms_ch7_5.
11 Require Import Coherence_ch7_8.
12 Require Import BinoidalCategories.
13
14 (* not in Awodey *)
15 Class PreMonoidalCat `(bc:BinoidalCat(C:=C))(I:C) :=
16 { pmon_I               := I
17 ; pmon_bin             := bc
18 ; pmon_cat             := C
19 ; pmon_assoc           : forall a b, (bin_second a >>>> bin_first b) <~~~> (bin_first b >>>> bin_second a)
20 ; pmon_cancelr         :                               (bin_first I) <~~~> functor_id C
21 ; pmon_cancell         :                              (bin_second I) <~~~> functor_id C
22 ; pmon_pentagon        : Pentagon (fun a b c f => f ⋉ c) (fun a b c f => c ⋊ f) (fun a b c => #((pmon_assoc a c) b))
23 ; pmon_triangle        : Triangle (fun a b c f => f ⋉ c) (fun a b c f => c ⋊ f) (fun a b c => #((pmon_assoc a c) b))
24                                   (fun a => #(pmon_cancell a)) (fun a => #(pmon_cancelr a))
25 ; pmon_assoc_rr        :  forall a b, (bin_first  (a⊗b)) <~~~> (bin_first  a >>>> bin_first  b)
26 ; pmon_assoc_ll        :  forall a b, (bin_second (a⊗b)) <~~~> (bin_second b >>>> bin_second a)
27 ; pmon_coherent_r      :  forall a c d:C,  #(pmon_assoc_rr c d a) ~~ #(pmon_assoc a d c)⁻¹
28 ; pmon_coherent_l      :  forall a c d:C,  #(pmon_assoc_ll c a d) ~~ #(pmon_assoc c d a)
29 ; pmon_assoc_central   :  forall a b c, CentralMorphism #(pmon_assoc   a b c)
30 ; pmon_cancelr_central :  forall a    , CentralMorphism #(pmon_cancelr a)
31 ; pmon_cancell_central :  forall a    , CentralMorphism #(pmon_cancell a)
32 }.
33 (*
34  * Premonoidal categories actually have three associators (the "f"
35  * indicates the position in which the operation is natural:
36  *
37  *  assoc    : (A ⋊ f) ⋉ C <->  A ⋊ (f ⋉  C)
38  *  assoc_rr : (f ⋉ B) ⋉ C <->  f ⋉ (B  ⊗ C)
39  *  assoc_ll : (A ⋊ B) ⋊ f <-> (A ⊗  B) ⋊ f
40  *
41  * Fortunately, in a monoidal category these are all the same natural
42  * isomorphism (and in any case -- monoidal or not -- the objects in
43  * the left column are all the same and the objects in the right
44  * column are all the same).  This formalization assumes that is the
45  * case even for premonoidal categories with non-central maps, in
46  * order to keep the complexity manageable.  I don't know much about
47  * the consequences of having them and letting them be different; you
48  * might need extra versions of the triangle/pentagon diagrams.
49  *)
50
51 Implicit Arguments pmon_cancell [ Ob Hom C bin_obj' bc I PreMonoidalCat ].
52 Implicit Arguments pmon_cancelr [ Ob Hom C bin_obj' bc I PreMonoidalCat ].
53 Implicit Arguments pmon_assoc   [ Ob Hom C bin_obj' bc I PreMonoidalCat ].
54 Coercion pmon_bin : PreMonoidalCat >-> BinoidalCat.
55
56 (* this turns out to be Exercise VII.1.1 from Mac Lane's CWM *)
57 Lemma MacLane_ex_VII_1_1 `{mn:PreMonoidalCat(I:=EI)} b a
58   : 
59   let    α := fun a b c => #((pmon_assoc a c) b)
60   in     α a b EI >>> _ ⋊ #(pmon_cancelr _) ~~ #(pmon_cancelr _).
61
62   intros.  simpl in α.
63
64   (* following Mac Lane's hint, we aim for (λ >>> α >>> λ×1)~~(λ >>> λ) *)
65   set (epic _ (iso_epic (pmon_cancelr ((a⊗b)⊗EI)))) as q.
66     apply q.
67     clear q.
68
69   (* next, we show that the hint goal above is implied by the bottom-left 1/5th of the big whiteboard diagram *)
70   set (ni_commutes pmon_cancelr (α a b EI)) as q.
71     setoid_rewrite <- associativity.
72     setoid_rewrite q.
73     clear q.
74     setoid_rewrite associativity.
75
76     set (ni_commutes pmon_cancelr (a ⋊ #(pmon_cancelr b))) as q.
77     simpl in q.
78     setoid_rewrite q.
79     clear q.
80
81     set (ni_commutes pmon_cancelr (#(pmon_cancelr (a⊗b)))) as q.
82     simpl in q.
83     setoid_rewrite q.
84     clear q.
85
86     setoid_rewrite <- associativity.
87     apply comp_respects; try reflexivity.
88
89   (* now we carry out the proof in the whiteboard diagram, starting from the pentagon diagram *)
90
91   (* top 2/5ths *)
92   assert (α (a⊗b) EI EI >>> α _ _ _ >>> (_ ⋊ (_ ⋊ #(pmon_cancell _))) ~~ #(pmon_cancelr _) ⋉ _ >>> α _ _ _).
93     set (pmon_triangle (a⊗b) EI) as tria.
94     simpl in tria.
95     unfold α; simpl.
96     setoid_rewrite tria.
97     clear tria.
98     setoid_rewrite associativity.
99     apply comp_respects; try reflexivity.
100     set (ni_commutes (pmon_assoc_ll a b) #(pmon_cancell EI)) as x.
101     simpl in x.
102     setoid_rewrite pmon_coherent_l in x.
103     apply x.
104
105   (* bottom 3/5ths *)
106   assert (((#((pmon_assoc a EI) b) ⋉ EI >>> #((pmon_assoc a EI) (b ⊗ EI))) >>>
107     a ⋊ #((pmon_assoc b EI) EI)) >>> a ⋊ (b ⋊ #(pmon_cancell EI))
108     ~~ α _ _ _ ⋉ _ >>> (_ ⋊ #(pmon_cancelr _)) ⋉ _ >>> α _ _ _).
109
110     unfold α; simpl.
111     repeat setoid_rewrite associativity.
112     apply comp_respects; try reflexivity.
113
114     set (ni_commutes (pmon_assoc a EI) (#(pmon_cancelr b) )) as x.
115     simpl in x.
116     setoid_rewrite <- associativity.
117     simpl in x.
118     setoid_rewrite <- x.
119     clear x.
120
121     setoid_rewrite associativity.
122     apply comp_respects; try reflexivity.
123     setoid_rewrite (fmor_preserves_comp (a⋊-)).
124     apply (fmor_respects (a⋊-)).
125
126     set (pmon_triangle b EI) as tria.
127     simpl in tria.
128     symmetry.
129     apply tria.
130
131   set (pmon_pentagon a b EI EI) as penta. unfold pmon_pentagon in penta. simpl in penta.
132
133   set (@comp_respects _ _ _ _ _ _ _ _ penta (a ⋊ (b ⋊ #(pmon_cancell EI))) (a ⋊ (b ⋊ #(pmon_cancell EI)))) as qq.
134     unfold α in H.
135     setoid_rewrite H in qq.
136     unfold α in H0.
137     setoid_rewrite H0 in qq.
138     clear H0 H.
139
140   unfold α.
141     apply (monic _ (iso_monic ((pmon_assoc a EI) b))).
142     apply qq.
143     clear qq penta.
144     reflexivity.
145     Qed.
146
147 Class PreMonoidalFunctor
148 `(PM1:PreMonoidalCat(C:=C1)(I:=I1))
149 `(PM2:PreMonoidalCat(C:=C2)(I:=I2))
150  (fobj : C1 -> C2                 ) :=
151 { mf_F          :> Functor C1 C2 fobj
152 ; mf_i          :  I2 ≅ mf_F I1
153 ; mf_first      :  ∀ a,              mf_F >>>> bin_first  (mf_F a)  <~~~>  bin_first  a >>>> mf_F
154 ; mf_second     :  ∀ a,              mf_F >>>> bin_second (mf_F a)  <~~~>  bin_second a >>>> mf_F
155 ; mf_consistent :  ∀ a b,            #(mf_first a b) ~~ #(mf_second b a)
156 ; mf_center     :  forall `(f:a~>b), CentralMorphism f -> CentralMorphism (mf_F \ f)
157 ; mf_cancell    :  ∀ b,     #(pmon_cancell _) ~~ #mf_i ⋉ _ >>> #(mf_first  b I1) >>> mf_F \ #(pmon_cancell b)
158 ; mf_cancelr    :  ∀ a,     #(pmon_cancelr _) ~~ _ ⋊ #mf_i >>> #(mf_second a I1) >>> mf_F \ #(pmon_cancelr a)
159 ; mf_assoc      :  ∀ a b c, #(pmon_assoc _ _ _)  >>> _ ⋊ #(mf_first _ _) >>>        #(mf_second _ _) ~~
160                             #(mf_second _ _) ⋉ _  >>>     #(mf_first _ _) >>> mf_F \ #(pmon_assoc a c b)
161 }.
162 Coercion mf_F : PreMonoidalFunctor >-> Functor.
163
164 Section PreMonoidalFunctorsCompose.
165   Context
166   `{PM1   :PreMonoidalCat(C:=C1)(I:=I1)}
167   `{PM2   :PreMonoidalCat(C:=C2)(I:=I2)}
168    {fobj12:C1 -> C2                    }
169    (PMF12 :PreMonoidalFunctor PM1 PM2 fobj12)
170   `{PM3   :PreMonoidalCat(C:=C3)(I:=I3)}
171    {fobj23:C2 -> C3                    }
172    (PMF23 :PreMonoidalFunctor PM2 PM3 fobj23).
173
174   Definition compose_mf := PMF12 >>>> PMF23.
175
176   Definition compose_mf_i : I3 ≅ PMF23 (PMF12 I1).
177     eapply iso_comp.
178     apply (mf_i(PreMonoidalFunctor:=PMF23)).
179     apply functors_preserve_isos.
180     apply (mf_i(PreMonoidalFunctor:=PMF12)).
181     Defined.
182
183   Definition compose_mf_first a : compose_mf >>>> bin_first (compose_mf a)  <~~~>  bin_first  a >>>> compose_mf.
184     set (mf_first(PreMonoidalFunctor:=PMF12) a) as mf_first12.
185     set (mf_first(PreMonoidalFunctor:=PMF23) (PMF12 a)) as mf_first23.
186     unfold functor_fobj in *; simpl in *.
187     unfold compose_mf.
188     eapply ni_comp.
189     apply (ni_associativity PMF12 PMF23 (- ⋉fobj23 (fobj12 a))).
190     eapply ni_comp.
191     apply (ni_respects1 PMF12 (PMF23 >>>> - ⋉fobj23 (fobj12 a)) (- ⋉fobj12 a >>>> PMF23)).
192     apply mf_first23.
193     clear mf_first23.
194
195     eapply ni_comp.
196     eapply ni_inv.
197     apply (ni_associativity PMF12 (- ⋉fobj12 a) PMF23).
198
199     apply ni_inv.
200     eapply ni_comp.
201     eapply ni_inv.
202     eapply (ni_associativity _ PMF12 PMF23).
203
204     apply ni_respects2.
205     apply ni_inv.
206     apply mf_first12.
207     Defined.
208     
209   Definition compose_mf_second a : compose_mf >>>> bin_second (compose_mf a)  <~~~>  bin_second  a >>>> compose_mf.
210     set (mf_second(PreMonoidalFunctor:=PMF12) a) as mf_second12.
211     set (mf_second(PreMonoidalFunctor:=PMF23) (PMF12 a)) as mf_second23.
212     unfold functor_fobj in *; simpl in *.
213     unfold compose_mf.
214     eapply ni_comp.
215     apply (ni_associativity PMF12 PMF23 (fobj23 (fobj12 a) ⋊-)).
216     eapply ni_comp.
217     apply (ni_respects1 PMF12 (PMF23 >>>> fobj23 (fobj12 a) ⋊-) (fobj12 a ⋊- >>>> PMF23)).
218     apply mf_second23.
219     clear mf_second23.
220
221     eapply ni_comp.
222     eapply ni_inv.
223     apply (ni_associativity PMF12 (fobj12 a ⋊ -) PMF23).
224
225     apply ni_inv.
226     eapply ni_comp.
227     eapply ni_inv.
228     eapply (ni_associativity (a ⋊-) PMF12 PMF23).
229
230     apply ni_respects2.
231     apply ni_inv.
232     apply mf_second12.
233     Defined.
234
235   (* this proof is really gross; I will write a better one some other day *)
236   Lemma mf_associativity_comp :
237    ∀a b c : C1,
238    (#((pmon_assoc (compose_mf a) (compose_mf c)) (fobj23 (fobj12 b))) >>>
239     compose_mf a ⋊ #((compose_mf_first c) b)) >>>
240    #((compose_mf_second a) (b ⊗ c)) ~~
241    (#((compose_mf_second a) b) ⋉ compose_mf c >>>
242     #((compose_mf_first c) (a ⊗ b))) >>> compose_mf \ #((pmon_assoc a c) b).
243     intros; intros.
244       unfold compose_mf_second; simpl.
245       unfold compose_mf_first; simpl.
246       unfold functor_comp; simpl.
247       unfold ni_respects1.
248       unfold functor_fobj; simpl.
249       
250       set (mf_first (fobj12 c)) as m'.
251       assert (mf_first (fobj12 c)=m'). reflexivity.
252       destruct m'; simpl.
253
254       set (mf_second (fobj12 a)) as m.
255       assert (mf_second (fobj12 a)=m). reflexivity.
256       destruct m; simpl.
257
258       Implicit Arguments id [[Ob][Hom][Category][a]].
259       idtac.
260
261       symmetry.
262       etransitivity.
263       repeat setoid_rewrite <- fmor_preserves_comp.
264       repeat setoid_rewrite fmor_preserves_id.
265       repeat setoid_rewrite left_identity.
266       repeat setoid_rewrite right_identity.
267       reflexivity.
268       symmetry.
269       etransitivity.
270       repeat setoid_rewrite <- fmor_preserves_comp.
271       repeat setoid_rewrite fmor_preserves_id.
272       repeat setoid_rewrite left_identity.
273       repeat setoid_rewrite right_identity.
274       reflexivity.
275
276       assert (   (#((pmon_assoc (fobj23 (fobj12 a)) (fobj23 (fobj12 c)))
277               (fobj23 (fobj12 b))) >>>
278           fobj23 (fobj12 a)
279           ⋊ (
280              (#(ni_iso (fobj12 b)) >>> ( (PMF23 \ #((mf_first c) b) ))))) >>>
281          (
282           (#(ni_iso0 (fobj12 (b ⊗ c))) >>>
283            ((PMF23 \ #((mf_second a) (b ⊗ c)))))) ~~
284          ((
285            (#(ni_iso0 (fobj12 b)) >>> ( (PMF23 \ #((mf_second a) b) ))))
286           ⋉ fobj23 (fobj12 c) >>>
287           (
288            (#(ni_iso (fobj12 (a ⊗ b))) >>>
289             ( (PMF23 \ #((mf_first c) (a ⊗ b))))))) >>>
290          PMF23 \ (PMF12 \ #((pmon_assoc a c) b))
291       ).
292
293       repeat setoid_rewrite associativity.
294       setoid_rewrite (fmor_preserves_comp PMF23).
295             unfold functor_comp in *.
296             unfold functor_fobj in *.
297             simpl in *.
298             rename ni_commutes into ni_commutes7.
299       set (mf_assoc(PreMonoidalFunctor:=PMF12)) as q.
300       set (ni_commutes7 _ _ (#((mf_second a) b))) as q'.
301       simpl in q'.
302       repeat setoid_rewrite associativity.
303       symmetry.
304       setoid_rewrite <- (fmor_preserves_comp (-⋉ fobj23 (fobj12 c))).
305       repeat setoid_rewrite <- associativity.
306       setoid_rewrite juggle1.
307       setoid_rewrite <- q'.
308       repeat setoid_rewrite associativity.
309       setoid_rewrite fmor_preserves_comp.
310       idtac.
311       unfold functor_fobj in *.
312       simpl in *.
313       repeat setoid_rewrite <- associativity.
314       setoid_rewrite <- q.
315       clear q.
316       repeat setoid_rewrite <- fmor_preserves_comp.
317       repeat setoid_rewrite <- associativity.
318       apply comp_respects; try reflexivity.
319       
320       set (mf_assoc(PreMonoidalFunctor:=PMF23) (fobj12 a) (fobj12 b) (fobj12 c)) as q.
321       unfold functor_fobj in *.
322       simpl in *.
323       
324       rewrite H in q.
325       rewrite H0 in q.
326       simpl in q.
327       repeat setoid_rewrite <- associativity.
328       repeat setoid_rewrite <- associativity in q.
329       setoid_rewrite <- q.
330       clear q.
331       unfold functor_fobj; simpl.
332       
333       repeat setoid_rewrite associativity.
334       apply comp_respects; try reflexivity.
335       apply comp_respects; try reflexivity.
336       auto.
337       
338       repeat setoid_rewrite associativity.
339       repeat setoid_rewrite associativity in H1.
340       repeat setoid_rewrite <- fmor_preserves_comp in H1.
341       repeat setoid_rewrite associativity in H1.
342       apply H1.
343       Qed.
344       Implicit Arguments id [[Ob][Hom][Category]].
345
346   (* this proof is really gross; I will write a better one some other day *)
347   Instance PreMonoidalFunctorsCompose : PreMonoidalFunctor PM1 PM3 (fobj23 ○ fobj12) :=
348   { mf_i      := compose_mf_i
349   ; mf_F      := compose_mf
350   ; mf_first  := compose_mf_first  
351   ; mf_second := compose_mf_second }.
352
353     intros; unfold compose_mf_first; unfold compose_mf_second.
354       set (mf_first (PMF12 a)) as x in *.
355       set (mf_second (PMF12 b)) as y in *.
356       assert (x=mf_first (PMF12 a)). reflexivity.
357       assert (y=mf_second (PMF12 b)). reflexivity.
358       destruct x.
359       destruct y.
360       simpl.
361       repeat setoid_rewrite left_identity.
362       repeat setoid_rewrite right_identity.
363       set (mf_consistent (PMF12 a) (PMF12 b)) as later.
364       apply comp_respects; try reflexivity.
365       rewrite <- H in later.
366       rewrite <- H0 in later.
367       simpl in later.
368       apply later.
369       apply fmor_respects.
370       apply mf_consistent.
371
372     intros.
373       simpl.
374       apply mf_center.
375       apply mf_center.
376       auto.
377
378     intros.
379       unfold compose_mf_first; simpl.
380       set (mf_first (PMF12 b)) as m.
381       assert (mf_first (PMF12 b)=m). reflexivity.
382       destruct m.
383       simpl.
384       unfold functor_fobj; simpl.
385       repeat setoid_rewrite <- fmor_preserves_comp.
386       repeat setoid_rewrite left_identity.
387       repeat setoid_rewrite right_identity.
388
389       set (mf_cancell b) as y.
390       set (mf_cancell (fobj12 b)) as y'.
391       unfold functor_fobj in *.
392       setoid_rewrite y in y'.
393       clear y.
394       setoid_rewrite <- fmor_preserves_comp in y'.
395       setoid_rewrite <- fmor_preserves_comp in y'.
396       etransitivity.
397       apply y'.
398       clear y'.
399
400       repeat setoid_rewrite <- associativity.
401       apply comp_respects; try reflexivity.
402       apply comp_respects; try reflexivity.
403       repeat setoid_rewrite associativity.
404       apply comp_respects; try reflexivity.
405
406       set (ni_commutes _ _ #mf_i) as x.
407       unfold functor_comp in x.
408       unfold functor_fobj in x.
409       simpl in x.
410       rewrite H.
411       simpl.
412       apply x.
413
414     intros.
415       unfold compose_mf_second; simpl.
416       set (mf_second (PMF12 a)) as m.
417       assert (mf_second (PMF12 a)=m). reflexivity.
418       destruct m.
419       simpl.
420       unfold functor_fobj; simpl.
421       repeat setoid_rewrite <- fmor_preserves_comp.
422       repeat setoid_rewrite left_identity.
423       repeat setoid_rewrite right_identity.
424
425       set (mf_cancelr a) as y.
426       set (mf_cancelr (fobj12 a)) as y'.
427       unfold functor_fobj in *.
428       setoid_rewrite y in y'.
429       clear y.
430       setoid_rewrite <- fmor_preserves_comp in y'.
431       setoid_rewrite <- fmor_preserves_comp in y'.
432       etransitivity.
433       apply y'.
434       clear y'.
435
436       repeat setoid_rewrite <- associativity.
437       apply comp_respects; try reflexivity.
438       apply comp_respects; try reflexivity.
439       repeat setoid_rewrite associativity.
440       apply comp_respects; try reflexivity.
441
442       set (ni_commutes _ _ #mf_i) as x.
443       unfold functor_comp in x.
444       unfold functor_fobj in x.
445       simpl in x.
446       rewrite H.
447       simpl.
448       apply x.
449
450     apply mf_associativity_comp.
451
452       Defined.
453
454 End PreMonoidalFunctorsCompose.
455
456
457 (*******************************************************************************)
458 (* Braided and Symmetric Categories                                            *)
459
460 Class BraidedCat `(mc:PreMonoidalCat) :=
461 { br_niso        : forall a, bin_first a <~~~> bin_second a
462 ; br_swap        := fun a b => ni_iso (br_niso b) a
463 ; triangleb      : forall a:C,     #(pmon_cancelr a) ~~ #(br_swap a (pmon_I(PreMonoidalCat:=mc))) >>> #(pmon_cancell a)
464 ; hexagon1       : forall {a b c}, #(pmon_assoc _ _ _) >>> #(br_swap a _) >>> #(pmon_assoc _ _ _)
465                                    ~~ #(br_swap _ _) ⋉ c >>> #(pmon_assoc _ _ _) >>> b ⋊ #(br_swap _ _)
466 ; hexagon2       : forall {a b c}, #(pmon_assoc _ _ _)⁻¹ >>> #(br_swap _ c) >>> #(pmon_assoc _ _ _)⁻¹
467                                    ~~ a ⋊ #(br_swap _ _) >>> #(pmon_assoc _ _ _)⁻¹ >>> #(br_swap _ _) ⋉ b
468 }.
469
470 Class SymmetricCat `(bc:BraidedCat) :=
471 { symcat_swap  :  forall a b:C, #((br_swap(BraidedCat:=bc)) a b) ~~ #(br_swap _ _)⁻¹
472 }.
473
474
475 (* a wide subcategory inherits the premonoidal structure if it includes all of the coherence maps *)
476 Section PreMonoidalWideSubcategory.
477
478   Context `(pm:PreMonoidalCat(I:=pmI)).
479   Context  {Pmor}(S:WideSubcategory pm Pmor).
480   Context  (Pmor_first  : forall {a}{b}{c}{f}(pf:Pmor a b f), Pmor _ _ (f ⋉ c)).
481   Context  (Pmor_second : forall {a}{b}{c}{f}(pf:Pmor a b f), Pmor _ _ (c ⋊ f)).
482   Context  (Pmor_assoc  : forall {a}{b}{c}, Pmor _ _ #(pmon_assoc a c b)).
483   Context  (Pmor_unassoc: forall {a}{b}{c}, Pmor _ _ #(pmon_assoc a c b)⁻¹).
484   Context  (Pmor_cancell: forall {a}, Pmor _ _ #(pmon_cancell a)).
485   Context  (Pmor_uncancell: forall {a}, Pmor _ _ #(pmon_cancell a)⁻¹).
486   Context  (Pmor_cancelr: forall {a}, Pmor _ _ #(pmon_cancelr a)).
487   Context  (Pmor_uncancelr: forall {a}, Pmor _ _ #(pmon_cancelr a)⁻¹).
488   Implicit Arguments Pmor_first [[a][b][c][f]].
489   Implicit Arguments Pmor_second [[a][b][c][f]].
490
491   Definition PreMonoidalWideSubcategory_first_fmor (a:S) : forall {x}{y}(f:x~~{S}~~>y), (bin_obj' x a)~~{S}~~>(bin_obj' y a).
492     unfold hom; simpl; intros.
493     destruct f.
494     simpl in *.
495     exists (bin_first(BinoidalCat:=pm) a \ x0).
496     apply Pmor_first; auto.
497     Defined.
498
499   Definition PreMonoidalWideSubcategory_second_fmor (a:S) : forall {x}{y}(f:x~~{S}~~>y), (bin_obj' a x)~~{S}~~>(bin_obj' a y).
500     unfold hom; simpl; intros.
501     destruct f.
502     simpl in *.
503     exists (bin_second(BinoidalCat:=pm) a \ x0).
504     apply Pmor_second; auto.
505     Defined.
506
507   Instance PreMonoidalWideSubcategory_first (a:S) : Functor S S (fun x => bin_obj' x a) :=
508     { fmor := fun x y f => PreMonoidalWideSubcategory_first_fmor a f }.
509     unfold PreMonoidalWideSubcategory_first_fmor; intros; destruct f; destruct f'; simpl in *.
510     apply (fmor_respects (bin_first(BinoidalCat:=pm) a)); auto.
511     unfold PreMonoidalWideSubcategory_first_fmor; intros; simpl in *.
512     apply (fmor_preserves_id (bin_first(BinoidalCat:=pm) a)); auto.
513     unfold PreMonoidalWideSubcategory_first_fmor; intros; destruct f; destruct g; simpl in *.
514     apply (fmor_preserves_comp (bin_first(BinoidalCat:=pm) a)); auto.
515     Defined.
516
517   Instance PreMonoidalWideSubcategory_second (a:S) : Functor S S (fun x => bin_obj' a x) :=
518     { fmor := fun x y f => PreMonoidalWideSubcategory_second_fmor a f }.
519     unfold PreMonoidalWideSubcategory_second_fmor; intros; destruct f; destruct f'; simpl in *.
520     apply (fmor_respects (bin_second(BinoidalCat:=pm) a)); auto.
521     unfold PreMonoidalWideSubcategory_second_fmor; intros; simpl in *.
522     apply (fmor_preserves_id (bin_second(BinoidalCat:=pm) a)); auto.
523     unfold PreMonoidalWideSubcategory_second_fmor; intros; destruct f; destruct g; simpl in *.
524     apply (fmor_preserves_comp (bin_second(BinoidalCat:=pm) a)); auto.
525     Defined.
526
527   Instance PreMonoidalWideSubcategory_is_Binoidal : BinoidalCat S bin_obj' :=
528     { bin_first  := PreMonoidalWideSubcategory_first
529     ; bin_second := PreMonoidalWideSubcategory_second }.
530
531   Definition PreMonoidalWideSubcategory_assoc_iso
532     : forall a b c, Isomorphic(C:=S) (bin_obj' (bin_obj' a b) c) (bin_obj' a (bin_obj' b c)).
533     intros.
534     refine {| iso_forward := existT _ _ (Pmor_assoc a b c) ; iso_backward := existT _ _ (Pmor_unassoc a b c) |}.
535     simpl; apply iso_comp1.
536     simpl; apply iso_comp2.
537     Defined.
538
539   Definition PreMonoidalWideSubcategory_assoc
540     : forall a b,
541       (PreMonoidalWideSubcategory_second a >>>> PreMonoidalWideSubcategory_first b) <~~~>
542       (PreMonoidalWideSubcategory_first  b >>>> PreMonoidalWideSubcategory_second a).
543     intros.
544     apply (@Build_NaturalIsomorphism _ _ _ _ _ _ _ _ (PreMonoidalWideSubcategory_second a >>>>
545       PreMonoidalWideSubcategory_first b) (PreMonoidalWideSubcategory_first b >>>>
546         PreMonoidalWideSubcategory_second a) (fun c => PreMonoidalWideSubcategory_assoc_iso a c b)).
547     intros; simpl.
548     unfold PreMonoidalWideSubcategory_second_fmor; simpl.
549     destruct f; simpl.
550     set (ni_commutes (pmon_assoc(PreMonoidalCat:=pm) a b) x) as q.
551     apply q.
552     Defined.
553
554   Definition PreMonoidalWideSubcategory_assoc_ll
555     : forall a b,
556       PreMonoidalWideSubcategory_second (a⊗b) <~~~>
557       PreMonoidalWideSubcategory_second b >>>> PreMonoidalWideSubcategory_second a.
558     intros.
559     apply (@Build_NaturalIsomorphism _ _ _ _ _ _ _ _
560              (PreMonoidalWideSubcategory_second (a⊗b))
561              (PreMonoidalWideSubcategory_second b >>>> PreMonoidalWideSubcategory_second a)
562              (fun c => PreMonoidalWideSubcategory_assoc_iso a b c)).
563     intros; simpl.
564     unfold PreMonoidalWideSubcategory_second_fmor; simpl.
565     destruct f; simpl.
566     set (ni_commutes (pmon_assoc_ll(PreMonoidalCat:=pm) a b) x) as q.
567     unfold functor_comp in q; simpl in q.
568     set (pmon_coherent_l(PreMonoidalCat:=pm)) as q'.
569     setoid_rewrite q' in q.
570     apply q.
571     Defined.
572
573   Definition PreMonoidalWideSubcategory_assoc_rr
574     : forall a b,
575       PreMonoidalWideSubcategory_first (a⊗b) <~~~>
576       PreMonoidalWideSubcategory_first a >>>> PreMonoidalWideSubcategory_first b.
577     intros.
578     apply ni_inv.
579     apply (@Build_NaturalIsomorphism _ _ _ _ _ _ _ _
580              (PreMonoidalWideSubcategory_first a >>>> PreMonoidalWideSubcategory_first b)
581              (PreMonoidalWideSubcategory_first (a⊗b))
582              (fun c => PreMonoidalWideSubcategory_assoc_iso c a b)).
583     intros; simpl.
584     unfold PreMonoidalWideSubcategory_second_fmor; simpl.
585     destruct f; simpl.
586     set (ni_commutes (pmon_assoc_rr(PreMonoidalCat:=pm) a b) x) as q.
587     unfold functor_comp in q; simpl in q.
588     set (pmon_coherent_r(PreMonoidalCat:=pm)) as q'.
589     setoid_rewrite q' in q.
590     apply iso_shift_right' in q.
591     apply iso_shift_left.
592     symmetry.
593     setoid_rewrite iso_inv_inv in q.
594     setoid_rewrite associativity.
595     apply q.
596     Defined.
597
598   Definition PreMonoidalWideSubcategory_cancelr_iso : forall a, Isomorphic(C:=S) (bin_obj' a pmI) a.
599     intros.
600     refine {| iso_forward := existT _ _ (Pmor_cancelr a) ; iso_backward := existT _ _ (Pmor_uncancelr a) |}.
601     simpl; apply iso_comp1.
602     simpl; apply iso_comp2.
603     Defined.
604
605   Definition PreMonoidalWideSubcategory_cancell_iso : forall a, Isomorphic(C:=S) (bin_obj' pmI a) a.
606     intros.
607     refine {| iso_forward := existT _ _ (Pmor_cancell a) ; iso_backward := existT _ _ (Pmor_uncancell a) |}.
608     simpl; apply iso_comp1.
609     simpl; apply iso_comp2.
610     Defined.
611
612   Definition PreMonoidalWideSubcategory_cancelr : PreMonoidalWideSubcategory_first pmI <~~~> functor_id _.
613     apply (@Build_NaturalIsomorphism _ _ _ _ _ _ _ _
614              (PreMonoidalWideSubcategory_first pmI) (functor_id _) PreMonoidalWideSubcategory_cancelr_iso).
615     intros; simpl.
616     unfold PreMonoidalWideSubcategory_first_fmor; simpl.
617     destruct f; simpl.
618     apply (ni_commutes (pmon_cancelr(PreMonoidalCat:=pm)) x).
619     Defined.
620
621   Definition PreMonoidalWideSubcategory_cancell : PreMonoidalWideSubcategory_second pmI <~~~> functor_id _.
622     apply (@Build_NaturalIsomorphism _ _ _ _ _ _ _ _
623              (PreMonoidalWideSubcategory_second pmI) (functor_id _) PreMonoidalWideSubcategory_cancell_iso).
624     intros; simpl.
625     unfold PreMonoidalWideSubcategory_second_fmor; simpl.
626     destruct f; simpl.
627     apply (ni_commutes (pmon_cancell(PreMonoidalCat:=pm)) x).
628     Defined.
629
630   Instance PreMonoidalWideSubcategory_PreMonoidal : PreMonoidalCat PreMonoidalWideSubcategory_is_Binoidal pmI :=
631   { pmon_assoc           := PreMonoidalWideSubcategory_assoc 
632   ; pmon_assoc_rr        := PreMonoidalWideSubcategory_assoc_rr
633   ; pmon_assoc_ll        := PreMonoidalWideSubcategory_assoc_ll
634   ; pmon_cancelr         := PreMonoidalWideSubcategory_cancelr
635   ; pmon_cancell         := PreMonoidalWideSubcategory_cancell
636   }.
637   apply Build_Pentagon.
638     intros; unfold PreMonoidalWideSubcategory_assoc; simpl.
639     set (pmon_pentagon(PreMonoidalCat:=pm) a b c) as q.
640     simpl in q.
641     apply q.
642   apply Build_Triangle.
643     intros; unfold PreMonoidalWideSubcategory_assoc;
644       unfold PreMonoidalWideSubcategory_cancelr; unfold PreMonoidalWideSubcategory_cancell; simpl.
645     set (pmon_triangle(PreMonoidalCat:=pm) a b) as q.
646     simpl in q.
647     apply q.
648     intros.
649
650   set (pmon_triangle(PreMonoidalCat:=pm)) as q.
651     apply q.
652
653   intros; simpl; reflexivity.
654   intros; simpl; reflexivity.
655
656   intros; simpl.
657     apply Build_CentralMorphism; intros; simpl; destruct g; simpl.
658     apply (pmon_assoc_central(PreMonoidalCat:=pm) a b c).
659     apply (pmon_assoc_central(PreMonoidalCat:=pm) a b c).
660
661   intros; simpl.
662     apply Build_CentralMorphism; intros; simpl; destruct g; simpl.
663     apply (pmon_cancelr_central(PreMonoidalCat:=pm) a).
664     apply (pmon_cancelr_central(PreMonoidalCat:=pm) a).
665
666   intros; simpl.
667     apply Build_CentralMorphism; intros; simpl; destruct g; simpl.
668     apply (pmon_cancell_central(PreMonoidalCat:=pm) a).
669     apply (pmon_cancell_central(PreMonoidalCat:=pm) a).
670     Defined.
671
672 End PreMonoidalWideSubcategory.
673
674
675 (* a full subcategory inherits the premonoidal structure if it includes the unit object and is closed under object-pairing *)
676 (*
677 Section PreMonoidalFullSubcategory.
678
679   Context `(pm:PreMonoidalCat(I:=pmI)).
680   Context  {Pobj}(S:FullSubcategory pm Pobj).
681   Context  (Pobj_unit:Pobj pmI).
682   Context  (Pobj_closed:forall {a}{b}, Pobj a -> Pobj b -> Pobj (a⊗b)).
683   Implicit Arguments Pobj_closed [[a][b]].
684
685   Definition PreMonoidalFullSubcategory_bobj (x y:S) :=
686     existT Pobj _ (Pobj_closed (projT2 x) (projT2 y)).
687
688   Definition PreMonoidalFullSubcategory_first_fmor (a:S) : forall {x}{y}(f:x~~{S}~~>y),
689     (PreMonoidalFullSubcategory_bobj x a)~~{S}~~>(PreMonoidalFullSubcategory_bobj y a).
690     unfold hom; simpl; intros.
691     destruct a as [a apf].
692     destruct x as [x xpf].
693     destruct y as [y ypf].
694     simpl in *.
695     apply (f ⋉ a).
696     Defined.
697
698   Definition PreMonoidalFullSubcategory_second_fmor (a:S) : forall {x}{y}(f:x~~{S}~~>y),
699     (PreMonoidalFullSubcategory_bobj a x)~~{S}~~>(PreMonoidalFullSubcategory_bobj a y).
700     unfold hom; simpl; intros.
701     destruct a as [a apf].
702     destruct x as [x xpf].
703     destruct y as [y ypf].
704     simpl in *.
705     apply (a ⋊ f).
706     Defined.
707
708   Instance PreMonoidalFullSubcategory_first (a:S)
709     : Functor S S (fun x => PreMonoidalFullSubcategory_bobj x a) :=
710     { fmor := fun x y f => PreMonoidalFullSubcategory_first_fmor a f }.
711     unfold PreMonoidalFullSubcategory_first_fmor; intros; destruct a; destruct a0; destruct b; simpl in *.
712     apply (fmor_respects (-⋉x)); auto.
713     unfold PreMonoidalFullSubcategory_first_fmor; intros; destruct a; destruct a0;  simpl in *.
714     apply (fmor_preserves_id (-⋉x)); auto.
715     unfold PreMonoidalFullSubcategory_first_fmor; intros;
716       destruct a; destruct a0; destruct b; destruct c; simpl in *.
717     apply (fmor_preserves_comp (-⋉x)); auto.
718     Defined.
719
720   Instance PreMonoidalFullSubcategory_second (a:S)
721     : Functor S S (fun x => PreMonoidalFullSubcategory_bobj a x) :=
722     { fmor := fun x y f => PreMonoidalFullSubcategory_second_fmor a f }.
723     unfold PreMonoidalFullSubcategory_second_fmor; intros; destruct a; destruct a0; destruct b; simpl in *.
724     apply (fmor_respects (x⋊-)); auto.
725     unfold PreMonoidalFullSubcategory_second_fmor; intros; destruct a; destruct a0;  simpl in *.
726     apply (fmor_preserves_id (x⋊-)); auto.
727     unfold PreMonoidalFullSubcategory_second_fmor; intros;
728       destruct a; destruct a0; destruct b; destruct c; simpl in *.
729     apply (fmor_preserves_comp (x⋊-)); auto.
730     Defined.
731
732   Instance PreMonoidalFullSubcategory_is_Binoidal : BinoidalCat S PreMonoidalFullSubcategory_bobj :=
733     { bin_first := PreMonoidalFullSubcategory_first
734     ; bin_second := PreMonoidalFullSubcategory_second }.
735
736   Definition PreMonoidalFullSubcategory_assoc
737     : forall a b,
738       (PreMonoidalFullSubcategory_second a >>>> PreMonoidalFullSubcategory_first b) <~~~>
739       (PreMonoidalFullSubcategory_first  b >>>> PreMonoidalFullSubcategory_second a).
740     Defined.
741
742   Definition PreMonoidalFullSubcategory_assoc_ll
743     : forall a b,
744       PreMonoidalFullSubcategory_second (a⊗b) <~~~>
745       PreMonoidalFullSubcategory_second b >>>> PreMonoidalFullSubcategory_second a.
746     intros.
747     Defined.
748
749   Definition PreMonoidalFullSubcategory_assoc_rr
750     : forall a b,
751       PreMonoidalFullSubcategory_first (a⊗b) <~~~>
752       PreMonoidalFullSubcategory_first a >>>> PreMonoidalFullSubcategory_first b.
753     intros.
754     Defined.
755
756   Definition PreMonoidalFullSubcategory_I := existT _ pmI Pobj_unit.
757
758   Definition PreMonoidalFullSubcategory_cancelr
759     : PreMonoidalFullSubcategory_first PreMonoidalFullSubcategory_I <~~~> functor_id _.
760     Defined.
761
762   Definition PreMonoidalFullSubcategory_cancell
763     : PreMonoidalFullSubcategory_second PreMonoidalFullSubcategory_I <~~~> functor_id _.
764     Defined.
765
766   Instance PreMonoidalFullSubcategory_PreMonoidal
767     : PreMonoidalCat PreMonoidalFullSubcategory_is_Binoidal PreMonoidalFullSubcategory_I :=
768   { pmon_assoc           := PreMonoidalFullSubcategory_assoc 
769   ; pmon_assoc_rr        := PreMonoidalFullSubcategory_assoc_rr
770   ; pmon_assoc_ll        := PreMonoidalFullSubcategory_assoc_ll
771   ; pmon_cancelr         := PreMonoidalFullSubcategory_cancelr
772   ; pmon_cancell         := PreMonoidalFullSubcategory_cancell
773   }.
774   Defined.
775 End PreMonoidalFullSubcategory.
776 *)