1 (****************************************************************************)
2 (* Chapter 7.1: Subcategories *)
3 (****************************************************************************)
5 Generalizable All Variables.
6 Require Import Notations.
7 Require Import Categories_ch1_3.
8 Require Import Functors_ch1_4.
9 Require Import Isomorphisms_ch1_5.
10 Require Import OppositeCategories_ch1_6_2.
11 Require Import NaturalTransformations_ch7_4.
12 Require Import NaturalIsomorphisms_ch7_5.
15 * See the README for an explanation of why there is "WideSubcategory"
16 * and "FullSubcategory" but no "Subcategory"
19 (* a full subcategory requires nothing more than a predicate on objects *)
20 Class FullSubcategory `(C:Category)(Pobj:C->Type) := { }.
22 (* the category construction for full subcategories is simpler: *)
23 Instance FullSubCategoriesAreCategories `(fsc:@FullSubcategory Ob Hom C Pobj)
24 : Category (sigT Pobj) (fun dom ran => (projT1 dom)~~{C}~~>(projT1 ran)) :=
25 { id := fun t => id (projT1 t)
26 ; eqv := fun a b f g => eqv _ _ f g
27 ; comp := fun a b c f g => f >>> g
29 intros; apply Build_Equivalence. unfold Reflexive.
31 unfold Symmetric; intros; simpl; symmetry; auto.
32 unfold Transitive; intros; simpl. transitivity y; auto.
33 intros; unfold Proper. unfold respectful. intros. simpl. apply comp_respects. auto. auto.
34 intros; simpl. apply left_identity.
35 intros; simpl. apply right_identity.
36 intros; simpl. apply associativity.
38 Coercion FullSubCategoriesAreCategories : FullSubcategory >-> Category.
40 (* every category is a subcategory of itself *)
42 Instance IdentitySubCategory `(C:Category Ob Hom) : SubCategory C (fun _ => True) (fun _ _ _ _ _ => True).
43 intros; apply Build_SubCategory.
47 (* the inclusion operation from a subcategory to its host is a functor *)
48 Instance InclusionFunctor `(C:Category Ob Hom)`(SP:@SubCategory _ _ C Pobj Pmor)
49 : Functor SP C (fun x => projT1 x) :=
50 { fmor := fun dom ran f => projT1 f }.
51 intros. unfold eqv in H. simpl in H. auto.
52 intros. simpl. reflexivity.
53 intros. simpl. reflexivity.
58 (* a wide subcategory includes all objects, so it requires nothing more than a predicate on each hom-set *)
59 Class WideSubcategory `(C:Category Ob Hom)(Pmor:forall a b:Ob, (a~>b) ->Type) : Type :=
60 { wsc_id_included : forall (a:Ob), Pmor a a (id a)
61 ; wsc_comp_included : forall (a b c:Ob) f g, (Pmor a b f) -> (Pmor b c g) -> (Pmor a c (f>>>g))
64 (* the category construction for full subcategories is simpler: *)
65 Instance WideSubCategoriesAreCategories `{C:Category(Ob:=Ob)}{Pmor}(wsc:WideSubcategory C Pmor)
66 : Category Ob (fun x y => sigT (Pmor x y)) :=
67 { id := fun t => existT _ (id t) (@wsc_id_included _ _ _ _ wsc t)
68 ; eqv := fun a b f g => eqv _ _ (projT1 f) (projT1 g)
69 ; comp := fun a b c f g => existT (Pmor a c) (projT1 f >>> projT1 g)
70 (@wsc_comp_included _ _ _ _ wsc _ _ _ _ _ (projT2 f) (projT2 g))
72 intros; apply Build_Equivalence. unfold Reflexive.
74 unfold Symmetric; intros; simpl; symmetry; auto.
75 unfold Transitive; intros; simpl. transitivity (projT1 y); auto.
76 intros; unfold Proper. unfold respectful. intros. simpl. apply comp_respects. auto. auto.
77 intros; simpl. apply left_identity.
78 intros; simpl. apply right_identity.
79 intros; simpl. apply associativity.
81 Coercion WideSubCategoriesAreCategories : WideSubcategory >-> Category.
83 (* the full image of a functor is a full subcategory *)
86 Context `(F:Functor(c1:=C)(c2:=D)).
88 Instance FullImage : Category C (fun x y => (F x)~~{D}~~>(F y)) :=
89 { id := fun t => id (F t)
90 ; eqv := fun x y f g => eqv(Category:=D) _ _ f g
91 ; comp := fun x y z f g => comp(Category:=D) _ _ _ f g
93 intros; apply Build_Equivalence. unfold Reflexive.
95 unfold Symmetric; intros; simpl; symmetry; auto.
96 unfold Transitive; intros; simpl. transitivity y; auto.
97 intros; unfold Proper. unfold respectful. intros. simpl. apply comp_respects. auto. auto.
98 intros; simpl. apply left_identity.
99 intros; simpl. apply right_identity.
100 intros; simpl. apply associativity.
103 Instance FullImage_InclusionFunctor : Functor FullImage D (fun x => F x) :=
104 { fmor := fun x y f => f }.
106 intros; simpl; reflexivity.
107 intros; simpl; reflexivity.
110 Instance RestrictToImage : Functor C FullImage (fun x => x) :=
111 { fmor := fun a b f => F \ f }.
112 intros; simpl; apply fmor_respects; auto.
113 intros; simpl; apply fmor_preserves_id; auto.
114 intros; simpl; apply fmor_preserves_comp; auto.
117 Lemma RestrictToImage_splits : F ~~~~ (RestrictToImage >>>> FullImage_InclusionFunctor).
118 unfold EqualFunctors; simpl; intros; apply heq_morphisms_intro.
123 Lemma RestrictToImage_splits_niso : F ≃ (RestrictToImage >>>> FullImage_InclusionFunctor).
124 unfold IsomorphicFunctors.
125 exists (fun A => iso_id (fobj A)).
128 setoid_rewrite left_identity.
129 setoid_rewrite right_identity.
135 (* any functor may be restricted to a subcategory of its domain *)
136 Section RestrictDomain.
138 Context `{C:Category}.
139 Context `{D:Category}.
140 Context `(F:!Functor C D fobj).
141 Context {Pmor}(S:WideSubcategory C Pmor).
143 Instance RestrictDomain : Functor S D fobj :=
144 { fmor := fun a b f => F \ (projT1 f) }.
145 intros; destruct f; destruct f'; simpl in *.
146 apply fmor_respects; auto.
147 intros. simpl. apply fmor_preserves_id.
148 intros; simpl; destruct f; destruct g; simpl in *.
149 apply fmor_preserves_comp.
155 Instance func_opSubcat `(c1:Category)`(c2:Category)`(SP:@SubCategory _ _ c2 Pobj Pmor)
156 {fobj}(F:Functor c1⁽ºᑭ⁾ SP fobj) : Functor c1 SP⁽ºᑭ⁾ fobj :=
157 { fmor := fun a b f => fmor F f }.
158 intros. apply (@fmor_respects _ _ _ _ _ _ _ F _ _ f f' H).
159 intros. apply (@fmor_preserves_id _ _ _ _ _ _ _ F a).
160 intros. apply (@fmor_preserves_comp _ _ _ _ _ _ _ F _ _ g _ f).
165 (* if a functor's range falls within a subcategory, then it is already a functor into that subcategory *)
166 Section FunctorWithRangeInSubCategory.
167 Context `(Cat1:Category O1 Hom1).
168 Context `(Cat2:Category O2 Hom2).
169 Context (Pobj:Cat2 -> Type).
170 Context (Pmor:forall a b:Cat2, (Pobj a) -> (Pobj b) -> (a~~{Cat2}~~>b) -> Type).
171 Context (SP:SubCategory Cat2 Pobj Pmor).
172 Context (Fobj:Cat1->Cat2).
174 Context (F:Functor Cat1 Cat2 Fobj).
175 Context (pobj:forall a, Pobj (F a)).
176 Context (pmor:forall a b f, Pmor (F a) (F b) (pobj a) (pobj b) (F \ f)).
177 Definition FunctorWithRangeInSubCategory_fobj (X:Cat1) : SP :=
178 existT Pobj (Fobj X) (pobj X).
179 Definition FunctorWithRangeInSubCategory_fmor (dom ran:Cat1)(X:dom~>ran) : (@hom _ _ SP
180 (FunctorWithRangeInSubCategory_fobj dom) (FunctorWithRangeInSubCategory_fobj ran)).
183 apply (pmor dom ran X).
185 Definition FunctorWithRangeInSubCategory : Functor Cat1 SP FunctorWithRangeInSubCategory_fobj.
186 apply Build_Functor with (fmor:=FunctorWithRangeInSubCategory_fmor);
188 unfold FunctorWithRangeInSubCategory_fmor;
190 setoid_rewrite H; auto.
191 apply (fmor_preserves_id F).
192 apply (fmor_preserves_comp F).
196 Context (F:Functor Cat1 Cat2⁽ºᑭ⁾ Fobj).
197 Context (pobj:forall a, Pobj (F a)).
198 Context (pmor:forall a b f, Pmor (F b) (F a) (pobj b) (pobj a) (F \ f)).
199 Definition FunctorWithRangeInSubCategoryOp_fobj (X:Cat1) : SP :=
200 existT Pobj (Fobj X) (pobj X).
201 Definition FunctorWithRangeInSubCategoryOp_fmor (dom ran:Cat1)(X:dom~>ran) :
202 (FunctorWithRangeInSubCategoryOp_fobj dom)~~{SP⁽ºᑭ⁾}~~>(FunctorWithRangeInSubCategoryOp_fobj ran).
205 apply (pmor dom ran X).
208 Definition FunctorWithRangeInSubCategoryOp : Functor Cat1 SP⁽ºᑭ⁾ FunctorWithRangeInSubCategoryOp_fobj.
209 apply Build_Functor with (fmor:=FunctorWithRangeInSubCategoryOp_fmor);
211 unfold FunctorWithRangeInSubCategoryOp_fmor;
213 apply (fmor_respects(Functor:=F)); auto.
214 apply (fmor_preserves_id(Functor:=F)).
216 set (@fmor_preserves_comp _ _ _ _ _ _ _ F _ _ f _ g) as qq.
217 setoid_rewrite <- qq.
222 End FunctorWithRangeInSubCategory.
226 (* Definition 7.1: faithful functors *)
227 Definition FaithfulFunctor `(F:Functor(c1:=C1)(c2:=C2)(fobj:=Fobj)) :=
228 forall (a b:C1), forall (f f':a~>b), (fmor _ f)~~(fmor _ f') -> f~~f'.
230 (* Definition 7.1: full functors *)
231 Class FullFunctor `(F:Functor(c1:=C1)(c2:=C2)(fobj:=Fobj)) :=
232 { ff_invert : forall {a b}(f:(Fobj a)~~{C2}~~>(Fobj b)) , { f' : a~~{C1}~~>b & (F \ f') ~~ f }
233 ; ff_respects : forall {a b}, Proper (eqv (Fobj a) (Fobj b) ==> eqv a b) (fun x => projT1 (@ff_invert a b x))
235 Coercion ff_invert : FullFunctor >-> Funclass.
237 (* Definition 7.1: (essentially) surjective on objects *)
238 Definition EssentiallySurjectiveOnObjects `(F:Functor(c1:=C1)(c2:=C2)(fobj:=Fobj)) :=
239 forall o2:C2, { o1:C1 & (F o1) ≅ o2 }.
241 (* Definition 7.1: (essentially) injective on objects *)
244 Class ConservativeFunctor `(F:Functor(c1:=C1)(c2:=C2)(fobj:=Fobj)) :=
245 { cf_reflect_iso : forall (a b:C1), (F a) ≅ (F b) -> a ≅ b
246 ; cf_reflect_iso1 : forall a b (i:(F a) ≅ (F b)), F \ #(cf_reflect_iso a b i) ~~ #i
247 ; cf_reflect_iso2 : forall a b (i:(F a) ≅ (F b)), F \ #(cf_reflect_iso a b i)⁻¹ ~~ #i⁻¹
250 (* "monic up to natural iso" *)
251 Definition WeaklyMonic
255 (F:@Functor _ _ C _ _ D Fobj) := forall
256 Eob EHom (E:@Category Eob EHom)
257 `{G :@Functor _ _ E _ _ C Gobj'}
258 `{H :@Functor _ _ E _ _ C Hobj'},
262 Section FullFaithfulFunctor_section.
263 Context `(F:Functor(c1:=C1)(c2:=C2)(fobj:=Fobj)).
264 Context (F_full:FullFunctor F).
265 Context (F_faithful:FaithfulFunctor F).
267 Lemma ff_functor_section_id_preserved : forall a:C1, projT1 (F_full _ _ (id (F a))) ~~ id a.
269 set (F_full a a (id (F a))) as qq.
273 setoid_rewrite fmor_preserves_id.
277 Definition ff_functor_section_fmor {a b:FullImage F} (f:a~~{FullImage F}~~>b) : a~~{C1}~~>b.
278 set (@ff_invert _ _ _ _ _ _ _ _ F_full _ _ f) as f'.
283 Lemma ff_functor_section_respectful {a2 b2 c2 : C1}
284 (x0 : Fobj b2 ~~{ C2 }~~> Fobj c2)
285 (x : Fobj a2 ~~{ C2 }~~> Fobj b2) :
286 (let (x1, _) := F_full a2 b2 x in x1) >>>
287 (let (x1, _) := F_full b2 c2 x0 in x1) ~~
288 (let (x1, _) := F_full a2 c2 (x >>> x0) in x1).
289 set (F_full _ _ x) as x_full.
290 set (F_full _ _ x0) as x0_full.
291 set (F_full _ _ (x >>> x0)) as x_x0_full.
297 setoid_rewrite <- (fmor_preserves_comp F).
303 Instance ff_functor_section_functor : Functor (FullImage F) C1 (fun x => x) :=
304 { fmor := fun a b f => ff_functor_section_fmor f }.
306 unfold ff_functor_section_fmor; simpl.
307 destruct (F_full a b f).
308 destruct (F_full a b f').
313 intros; simpl; subst.
314 apply ff_functor_section_id_preserved.
316 apply ff_functor_section_respectful.
319 Lemma ff_functor_section_splits_helper (a2 b2:C1)(f:existT (fun d : C2, {c : C1 & Fobj c = d}) (Fobj a2)
320 (existT (fun c : C1, Fobj c = Fobj a2) a2 (eq_refl _)) ~~{
322 }~~> existT (fun d : C2, {c : C1 & Fobj c = d})
323 (Fobj b2) (existT (fun c : C1, Fobj c = Fobj b2) b2 (eq_refl _)))
324 : F \ (let (x1, _) := F_full a2 b2 f in x1) ~~ f.
326 set (F_full a2 b2 f) as qq.
331 Lemma ff_functor_section_splits : (ff_functor_section_functor >>>> RestrictToImage F) ~~~~ functor_id _.
332 unfold EqualFunctors; intros; simpl.
333 unfold ff_functor_section_fmor; simpl.
334 destruct (F_full a b f).
336 apply (@heq_morphisms_intro _ _ (FullImage F) a b).
342 Lemma ff_functor_section_splits_niso : (ff_functor_section_functor >>>> RestrictToImage F) ≃ functor_id _.
344 exists iso_id; intros.
346 unfold functor_comp; simpl.
347 setoid_rewrite left_identity.
348 setoid_rewrite right_identity.
349 unfold ff_functor_section_fmor.
350 destruct (F_full A B f).
354 Lemma ff_functor_section_splits_niso' : (RestrictToImage F >>>> ff_functor_section_functor) ≃ functor_id _.
356 exists iso_id; intros.
358 unfold functor_comp; simpl.
359 setoid_rewrite left_identity.
360 setoid_rewrite right_identity.
361 unfold ff_functor_section_fmor.
362 destruct (F_full A B (F \ f)).
367 Context (CF:ConservativeFunctor F).
369 Lemma if_fullimage `{C0:Category}{Aobj}{Bobj}{A:Functor C0 C1 Aobj}{B:Functor C0 C1 Bobj} :
370 A >>>> F ≃ B >>>> F ->
371 A >>>> RestrictToImage F ≃ B >>>> RestrictToImage F.
374 unfold IsomorphicFunctors.
375 set (fun A => functors_preserve_isos (RestrictToImage F) (cf_reflect_iso _ _ (x A))).
378 unfold RestrictToImage.
381 unfold functor_comp in H.
383 rewrite (cf_reflect_iso1(ConservativeFunctor:=CF) _ _ (x A0)).
384 rewrite (cf_reflect_iso1(ConservativeFunctor:=CF) _ _ (x B0)).
388 Lemma ffc_functor_weakly_monic : ConservativeFunctor F -> WeaklyMonic F.
390 unfold WeaklyMonic; intros.
391 apply (if_comp(F2:=G>>>>functor_id _)).
393 apply if_right_identity.
395 apply (if_comp(F2:=H0>>>>functor_id _)).
397 apply if_right_identity.
399 apply (if_comp(F2:=G>>>>(RestrictToImage F >>>> ff_functor_section_functor))).
400 apply (if_respects G G (functor_id C1) (RestrictToImage F >>>> ff_functor_section_functor)).
403 apply ff_functor_section_splits_niso'.
405 apply (if_comp(F2:=H0>>>>(RestrictToImage F >>>> ff_functor_section_functor))).
406 apply (if_respects H0 H0 (functor_id C1) (RestrictToImage F >>>> ff_functor_section_functor)).
409 apply ff_functor_section_splits_niso'.
411 ((H0 >>>> (RestrictToImage F >>>> ff_functor_section_functor))
412 ≃ ((H0 >>>> RestrictToImage F) >>>> ff_functor_section_functor)).
414 apply (if_associativity H0 (RestrictToImage F) ff_functor_section_functor).
419 ((G >>>> (RestrictToImage F >>>> ff_functor_section_functor))
420 ≃ ((G >>>> RestrictToImage F) >>>> ff_functor_section_functor)).
422 apply (if_associativity G (RestrictToImage F) ff_functor_section_functor).
425 apply (if_respects (G >>>> RestrictToImage F) (H0 >>>> RestrictToImage F)
426 ff_functor_section_functor ff_functor_section_functor).
433 setoid_rewrite left_identity.
434 setoid_rewrite right_identity.
438 End FullFaithfulFunctor_section.