Jon Sterling, started 16th Dec 2022 \begin{code} {-# OPTIONS --safe --without-K #-} open import UF.FunExt module Categories.Functor (fe : Fun-Ext) where open import MLTT.Spartan open import UF.Equiv open import UF.Subsingletons open import UF.Subsingletons-FunExt open import Categories.Category fe module functor-of-precategories (𝓒 : precategory 𝓤 𝓥) (𝓓 : precategory 𝓤' 𝓥') where private module 𝓒 = precategory 𝓒 module 𝓓 = precategory 𝓓 functor-structure : 𝓤 ⊔ 𝓥 ⊔ 𝓤' ⊔ 𝓥' ̇ functor-structure = Σ ob ꞉ (𝓒.ob → 𝓓.ob) , ((A B : 𝓒.ob) (f : 𝓒.hom A B) → 𝓓.hom (ob A) (ob B)) module functor-structure (F : functor-structure) where ob : 𝓒.ob → 𝓓.ob ob = pr₁ F hom : {A B : 𝓒.ob} (f : 𝓒.hom A B) → 𝓓.hom (ob A) (ob B) hom = pr₂ F _ _ module _ (F : functor-structure) where open functor-structure F statement-preserves-idn : 𝓤 ⊔ 𝓥' ̇ statement-preserves-idn = (A : 𝓒.ob) → hom (𝓒.idn A) = 𝓓.idn (ob A) statement-preserves-seq : 𝓤 ⊔ 𝓥 ⊔ 𝓥' ̇ statement-preserves-seq = (A B C : 𝓒.ob) → (f : 𝓒.hom A B) → (g : 𝓒.hom B C) → hom (𝓒.seq f g) = 𝓓.seq (hom f) (hom g) functor-axioms : 𝓤 ⊔ 𝓥 ⊔ 𝓥' ̇ functor-axioms = statement-preserves-idn × statement-preserves-seq module functor-axioms (ax : functor-axioms) where preserves-idn : statement-preserves-idn preserves-idn = pr₁ ax preserves-seq : statement-preserves-seq preserves-seq = pr₂ ax preserving-idn-is-prop : is-prop statement-preserves-idn preserving-idn-is-prop = Π-is-prop fe λ _ → 𝓓.hom-is-set _ _ preserving-seq-is-prop : is-prop statement-preserves-seq preserving-seq-is-prop = Π-is-prop fe λ _ → Π-is-prop fe λ _ → Π-is-prop fe λ _ → Π-is-prop fe λ _ → Π-is-prop fe λ _ → 𝓓.hom-is-set _ _ functor-axioms-is-prop : is-prop functor-axioms functor-axioms-is-prop = ×-is-prop preserving-idn-is-prop preserving-seq-is-prop record functor : 𝓤 ⊔ 𝓥 ⊔ 𝓤' ⊔ 𝓥' ̇ where constructor make field str : functor-structure ax : functor-axioms str open functor-structure str public open functor-axioms str ax public module functor-as-sum where to-sum : functor → Σ functor-axioms to-sum F = let open functor F in str , ax from-sum : Σ functor-axioms → functor from-sum F = make (pr₁ F) (pr₂ F) to-sum-is-equiv : is-equiv to-sum pr₁ (pr₁ to-sum-is-equiv) = from-sum pr₂ (pr₁ to-sum-is-equiv) _ = refl pr₁ (pr₂ to-sum-is-equiv) = from-sum pr₂ (pr₂ to-sum-is-equiv) _ = refl equiv : functor ≃ Σ functor-axioms equiv = to-sum , to-sum-is-equiv module functor-of-categories (𝓒 𝓓 : category 𝓤 𝓥) where open functor-of-precategories (category-to-precategory 𝓒) (category-to-precategory 𝓓) public module identity-functor (𝓒 : precategory 𝓤 𝓥) where open functor-of-precategories str : functor-structure 𝓒 𝓒 str = id , λ _ _ → id ax : functor-axioms 𝓒 𝓒 str ax = (λ A → refl) , (λ A B C f g → refl) fun : functor 𝓒 𝓒 fun = make str ax module composite-functor {𝓒 : precategory 𝓣 𝓤} {𝓓 : precategory 𝓣' 𝓤'} {𝓔 : precategory 𝓥 𝓦} (open functor-of-precategories) (F : functor 𝓒 𝓓) (G : functor 𝓓 𝓔) where private module 𝓒 = precategory 𝓒 module 𝓓 = precategory 𝓓 module 𝓔 = precategory 𝓔 module F = functor F module G = functor G ob : 𝓒.ob → 𝓔.ob ob A = G.ob (F.ob A) hom : (A B : 𝓒.ob) (f : 𝓒.hom A B) → 𝓔.hom (ob A) (ob B) hom A B f = G.hom (F.hom f) str : functor-structure 𝓒 𝓔 str = ob , hom preserves-idn : (A : 𝓒.ob) → hom A A (𝓒.idn A) = 𝓔.idn (ob A) preserves-idn A = G.hom (F.hom (𝓒.idn A)) =⟨ ap G.hom (F.preserves-idn A) ⟩ G.hom (𝓓.idn (F.ob A)) =⟨ G.preserves-idn (F.ob A) ⟩ 𝓔.idn (ob A) ∎ preserves-seq : (A B C : 𝓒.ob) (f : 𝓒.hom A B) (g : 𝓒.hom B C) → hom A C (𝓒.seq f g) = 𝓔.seq (hom A B f) (hom B C g) preserves-seq A B C f g = G.hom (F.hom (𝓒.seq f g)) =⟨ ap G.hom (F.preserves-seq A B C f g) ⟩ G.hom (𝓓.seq (F.hom f) (F.hom g)) =⟨ G.preserves-seq (F.ob A) (F.ob B) (F.ob C) (F.hom f) (F.hom g) ⟩ 𝓔.seq (G.hom (F.hom f)) (G.hom (F.hom g)) ∎ ax : functor-axioms 𝓒 𝓔 str ax = preserves-idn , preserves-seq fun : functor 𝓒 𝓔 fun = make str ax