3e26e376592aa1157989e362e2c6884b237cd31d
[coq-categories.git] / src / FreydCategories.v
1 (*******************************************************************************)
2 (* Freyd Categories                                                            *)
3 (*******************************************************************************)
4
5 Generalizable All Variables.
6 Require Import Preamble.
7 Require Import General.
8 Require Import Categories_ch1_3.
9 Require Import Functors_ch1_4.
10 Require Import Isomorphisms_ch1_5.
11 Require Import ProductCategories_ch1_6_1.
12 Require Import InitialTerminal_ch2_2.
13 Require Import Subcategories_ch7_1.
14 Require Import NaturalTransformations_ch7_4.
15 Require Import NaturalIsomorphisms_ch7_5.
16 Require Import Coherence_ch7_8.
17 Require Import BinoidalCategories.
18 Require Import PreMonoidalCategories.
19 Require Import PreMonoidalCenter.
20 Require Import MonoidalCategories_ch7_8.
21
22 (* A Freyd Category is... *)
23 Class FreydCategory
24
25   (* a cartesian category C *)
26   `(C:CartesianCat(Ob:=Ob)(C:=C1))
27
28   (* a premonoidal category K with the same objects (its unit object is 1 because the functor is both IIO and strict) *)
29   `(K:PreMonoidalCat(Ob:=Ob)(bin_obj':=bobj)(I:=@one _ _ _ C))
30
31   (* an identity-on-objects functor J:C->Z(K) *)
32 := { fc_J       : Functor C (Center_is_Monoidal K) (fun x => exist (fun _ => True) x I)
33
34   (* which is not only monoidal *)
35    ; fc_mf_J    : MonoidalFunctor C (Center_is_Monoidal K) fc_J
36
37    (* but in fact strict (meaning the functor's coherence maps are identities) *)
38    (*; fc_strict  : forall a b, #(mf_first a b) ~~ id _ 
39          FIXME - I will need to separate Subcategory from FullSubCategory in order to fix this *)
40
41    ; fc_C       := C
42    ; fc_K       := K
43    }.
44
45 Coercion fc_mf_J   : FreydCategory >-> MonoidalFunctor.
46 Coercion fc_K      : FreydCategory >-> PreMonoidalCat.
47