module Cat.Instances.Discrete where
private variable β β' : Level X : Type β C : Precategory β β' open Precategory open Functor open _=>_
Discrete categoriesπ
Given a groupoid we can build the category with space of objects and a single morphism whenever
Disc : (A : Type β) β is-groupoid A β Precategory β β Disc A A-grpd .Ob = A Disc A A-grpd .Hom = _β‘_ Disc A A-grpd .Hom-set = A-grpd Disc A A-grpd .id = refl Disc A A-grpd ._β_ p q = q β p Disc A A-grpd .idr _ = β-idl _ Disc A A-grpd .idl _ = β-idr _ Disc A A-grpd .assoc _ _ _ = sym (β-assoc _ _ _) Disc' : Set β β Precategory β β Disc' A = Disc β£ A β£ h where abstract h : is-groupoid β£ A β£ h = is-hlevel-suc 2 (A .is-tr)
Clearly this is a univalent groupoid:
Disc-is-category : β {A : Type β} {A-grpd} β is-category (Disc A A-grpd) Disc-is-category .to-path is = is .to Disc-is-category .to-path-over is = β -pathp _ _ _ Ξ» i j β is .to (i β§ j) Disc-is-groupoid : β {A : Type β} {A-grpd} β is-pregroupoid (Disc A A-grpd) Disc-is-groupoid p = make-invertible _ (sym p) (β-invl p) (β-invr p)
We can lift any function between the underlying types to a functor between discrete categories. This is because every function automatically respects equality in a functorial way.
lift-disc : β {A : Set β} {B : Set β'} β (β£ A β£ β β£ B β£) β Functor (Disc' A) (Disc' B) lift-disc f .Fβ = f lift-disc f .Fβ = ap f lift-disc f .F-id = refl lift-disc f .F-β p q = ap-β f q p
Codisc' : β {β'} β Type β β Precategory β β' Codisc' x .Ob = x Codisc' x .Hom _ _ = Lift _ β€ Codisc' x .Hom-set _ _ = is-propβis-set (Ξ» _ _ i β lift tt) Codisc' x .id = lift tt Codisc' x ._β_ _ _ = lift tt Codisc' x .idr _ = refl Codisc' x .idl _ = refl Codisc' x .assoc _ _ _ = refl
Diagrams in Disc(X)π
If
is a discrete type, then it is in
particular in Set, and we can make diagrams
of shape
in some category
using the decidable equality on
We note that the decidable equality is redundant information:
The construction Disc' above extends into a left adjoint to the Ob functor.
Disc-diagram : β {X : Set β} β¦ _ : Discrete β£ X β£ β¦ β (β£ X β£ β Ob C) β Functor (Disc' X) C Disc-diagram {C = C} {X = X} β¦ d β¦ f = F where module C = Precategory C P : β£ X β£ β β£ X β£ β Type _ P x y = C.Hom (f x) (f y) go : β {x y : β£ X β£} β x β‘ y β Dec (x β‘α΅’ y) β P x y go {x} {.x} p (yes reflα΅’) = C.id go {x} {y} p (no Β¬p) = absurd (Β¬p (Idβpath.from p))
The object part of the functor is the provided and the decidable equality is used to prove that respects equality. This is why itβs redundant: automatically respects equality, because itβs a function! However, by using the decision procedure, we get better computational behaviour: Very often, will be and substitution along is easy to deal with.
F : Functor _ _ F .Fβ = f F .Fβ {x} {y} p = go p (x β‘α΅’? y)
Proving that our our is functorial involves a bunch of tedious computations with equalities and a whole waterfall of absurd cases:
F .F-id {x} = refl F .F-β {x} {y} {z} f g = J (Ξ» y g β β {z} (f : y β‘ z) β go (g β f) (x β‘α΅’? z) β‘ go f (y β‘α΅’? z) C.β go g (x β‘α΅’? y)) (Ξ» f β J (Ξ» z f β go (refl β f) (x β‘α΅’? z) β‘ go f (x β‘α΅’? z) C.β C.id) (sym (C.idr _)) f) g f
Disc-adjunct : β {iss : is-groupoid X} β (X β Ob C) β Functor (Disc X iss) C Disc-adjunct {C = C} F .Fβ = F Disc-adjunct {C = C} F .Fβ p = subst (C .Hom (F _) β F) p (C .id) Disc-adjunct {C = C} F .F-id = transport-refl _ Disc-adjunct {C = C} {iss = iss} F .F-β {x} {y} {z} f g = path where import Cat.Reasoning C as C go = Disc-adjunct {C = C} {iss} F .Fβ abstract path : go (g β f) β‘ C ._β_ (go f) (go g) path = J' (Ξ» y z f β β {x} (g : x β‘ y) β go (g β f) β‘ go f C.β go g) (Ξ» x g β subst-β (C .Hom (F _) β F) _ _ _ Β·Β· transport-refl _ Β·Β· C.introl (transport-refl _)) f {x} g Disc-into : β {β} (X : Set β) β (F : C .Ob β β£ X β£) β (Fβ : β {x y} β C .Hom x y β F x β‘ F y) β Functor C (Disc' X) Disc-into X F Fβ .Fβ = F Disc-into X F Fβ .Fβ = Fβ Disc-into X F Fβ .F-id = X .is-tr _ _ _ _ Disc-into X F Fβ .F-β _ _ = X .is-tr _ _ _ _
Disc-natural : β {X : Set β} β {F G : Functor (Disc' X) C} β (β x β C .Hom (F .Fβ x) (G .Fβ x)) β F => G Disc-natural fam .Ξ· = fam Disc-natural {C = C} {F = F} {G = G} fam .is-natural x y f = J (Ξ» y p β fam y C.β F .Fβ p β‘ G .Fβ p C.β fam x) (C.elimr (F .F-id) β C.introl (G .F-id)) f where module C = Cat.Reasoning C Disc-naturalβ : β {X : Type β} {Y : Type β'} β {issx : is-groupoid X} {issy : is-groupoid Y} β {F G : Functor (Disc X issx ΓαΆ Disc Y issy) C} β ((x : X Γ Y) β C .Hom (F .Fβ x) (G .Fβ x)) β F => G Disc-naturalβ fam .Ξ· = fam Disc-naturalβ {C = C} {F = F} {G = G} fam .is-natural x y (p , q) = J (Ξ» y' p' β fam y' C.β F .Fβ (ap fst p' , ap snd p') β‘ G .Fβ (ap fst p' , ap snd p') C.β fam x) (C.elimr (F .F-id) β C.introl (G .F-id)) (Ξ£-pathp p q) where module C = Cat.Reasoning C