# Library UniMath.CategoryTheory.Subcategory.Core

## Sub(pre)categories

Authors: Benedikt Ahrens, Chris Kapulkin, Mike Shulman (January 2013) Reorganized and expanded: Langston Barrett (@siddharthist) (March 2018)

## Contents :

Require Import UniMath.Foundations.Sets.
Require Import UniMath.MoreFoundations.PartA.

Require Import UniMath.CategoryTheory.Core.Categories.
Require Import UniMath.CategoryTheory.Core.Functors.

Local Open Scope cat.

## Definitions

A sub-precategory is specified through a predicate on objects and a dependent predicate on morphisms which is compatible with identity and composition

Definition is_sub_precategory {C : precategory}
(C' : hsubtype C)
(Cmor' : a b : C, hsubtype (a --> b)) :=
( a : C, C' a Cmor' _ _ (identity a)) ×
( (a b c : C) (f: a --> b) (g : b --> c),
Cmor' _ _ f Cmor' _ _ g Cmor' _ _ (f · g)).

Definition sub_precategories (C : precategory) :=
total2 (fun C' : (hsubtype (ob C)) × ( a b:ob C, hsubtype (a --> b))
is_sub_precategory (pr1 C') (pr2 C')).

We have a coercion carrier turning every predicate P on a type A into the total space { a : A & P a} .
For later, we define some projections with the appropriate type, also to avoid confusion with the aforementioned coercion.

Definition sub_precategory_predicate_objects {C : precategory}
(C': sub_precategories C):
hsubtype (ob C) := pr1 (pr1 C').

Definition sub_ob {C : precategory}(C': sub_precategories C): UU :=
(sub_precategory_predicate_objects C').

Definition sub_precategory_predicate_morphisms {C : precategory}
(C':sub_precategories C) (a b : C) : hsubtype (a --> b) := pr2 (pr1 C') a b.

Definition sub_precategory_morphisms {C : precategory}(C':sub_precategories C)
(a b : C) : UU := sub_precategory_predicate_morphisms C' a b.

Projections for compatibility of the predicate with identity and composition.
An object of a subprecategory is an object of the original precategory.
A morphism of a subprecategory is also a morphism of the original precategory.

### A sub-precategory forms a precategory.

Definition sub_precategory_ob_mor (C : precategory)(C':sub_precategories C) :
precategory_ob_mor.
Proof.
(sub_ob C').
exact (λ a b, @sub_precategory_morphisms _ C' a b).
Defined.

Definition sub_precategory_data (C : precategory)(C':sub_precategories C) :
precategory_data.
Proof.
(sub_precategory_ob_mor C C').
split.
intro c.
(identity (C:=C) (pr1 c)).
apply sub_precategory_id.
apply (pr2 c).
intros a b c f g.
(compose (pr1 f) (pr1 g)).
apply sub_precategory_comp.
apply (pr2 f). apply (pr2 g).
Defined.

A useful lemma for equality in the sub-precategory.

Lemma eq_in_sub_precategory (C : precategory)(C':sub_precategories C)
(a b : sub_ob C') (f g : sub_precategory_morphisms C' a b) :
pr1 f = pr1 g f = g.
Proof.
intro H.
apply (total2_paths_f H).
apply proofirrelevance.
apply pr2.
Qed.

Definition is_precategory_sub_precategory (C : precategory)(C':sub_precategories C) :
is_precategory (sub_precategory_data C C').
Proof.
repeat split;
simpl; intros.
unfold sub_precategory_comp;
apply eq_in_sub_precategory; simpl;
apply id_left.
apply eq_in_sub_precategory. simpl.
apply id_right.
apply eq_in_sub_precategory.
cbn.
apply assoc.
apply eq_in_sub_precategory.
cbn.
apply assoc'.
Defined.

Definition carrier_of_sub_precategory (C : precategory)(C':sub_precategories C) :
precategory := tpair _ _ (is_precategory_sub_precategory C C').

Coercion carrier_of_sub_precategory : sub_precategories >-> precategory.

An object satisfying the predicate is an object of the subprecategory
Definition precategory_object_in_subcat {C : precategory} {C':sub_precategories C}
(a : ob C) (p : sub_precategory_predicate_objects C' a) :
ob C' := tpair _ a p.

A morphism satisfying the predicate is a morphism of the subprecategory
Definition precategory_morphisms_in_subcat {C : precategory} {C':sub_precategories C}
{a b : ob C'}(f : pr1 a --> pr1 b)
(p : sub_precategory_predicate_morphisms C' (pr1 a) (pr1 b) (f)) :
precategory_morphisms (C:=C') a b := tpair _ f p.

### (Inclusion) functor from a sub-precategory to the ambient precategory

Definition sub_precategory_inclusion_data (C : precategory) (C':sub_precategories C):
functor_data C' C.
Proof.
(@pr1 _ _ ).
intros a b.
exact (@pr1 _ _ ).
Defined.

Definition is_functor_sub_precategory_inclusion (C : precategory)
(C':sub_precategories C) :
is_functor (sub_precategory_inclusion_data C C').
Proof.
split; simpl.
unfold functor_idax . intros. apply (idpath _ ).
unfold functor_compax . intros. apply (idpath _ ).
Qed.

Definition sub_precategory_inclusion (C : precategory) (C' : sub_precategories C) :
functor C' C := tpair _ _ (is_functor_sub_precategory_inclusion C C').

## Subcategories

The hom-types of a subprecategory are sets if the hom-types of the original category are.

Lemma is_set_sub_precategory_morphisms {C : precategory} (hs: has_homsets C)
(C' : sub_precategories C) (a b : ob C) :
isaset (sub_precategory_morphisms C' a b).
Proof.
apply isofhlevel_hsubtype, hs.
Defined.

Definition sub_precategory_morphisms_set {C : precategory} (hs: has_homsets C)
(C':sub_precategories C) (a b : ob C) : hSet :=
tpair _ (sub_precategory_morphisms C' a b)
(is_set_sub_precategory_morphisms hs C' a b).

Definition subcategory (C : category) (C' : sub_precategories C) : category.
Proof.
use make_category.
- exact (carrier_of_sub_precategory C C').
- intros ? ?.
apply is_set_sub_precategory_morphisms.
apply homset_property.
Defined.

## Restriction of a functor to a subcategory

Definition restrict_functor_to_sub_precategory {C D : precategory}
(C' : sub_precategories C) (F : functor C D) : functor C' D.
Proof.
use make_functor.
- use make_functor_data.
+ exact (F precategory_object_from_sub_precategory_object _ C')%functions.
+ intros ? ?.
apply (# F precategory_morphism_from_sub_precategory_morphism _ C' _ _)%functions.
- use make_dirprod.
+ intro; apply (functor_id F).
+ intros ? ? ? ? ?; apply (functor_comp F).
Defined.