module Cat.Functor.Adjoint.ConstD {o ℓ} {C : Precategory o ℓ} whereopen _=>_
private
variable
o' ℓ' : Level
J D : Precategory o' ℓ'
F G : Functor J C
open module C = Cat.Reasoning C(Partial) adjoints to the diagonal functor🔗
Suppose that is a free object with respect to and then is a colimit of
const-free→colim : Free-object ConstD F → Colimit F
const-free→colim {F} free-ob = to-colimit $ to-is-colimit $ record where
open module free = Free-object free-ob
ψ = unit .η
universal {x} eta commutes = fold {x} (NT eta λ j k f → commutes f ∙ sym (idl _))
commutes {j} {k} f = unit .is-natural _ _ f ∙ idl _
factors {j} eta p = commute {f = NT eta λ x y f → p f ∙ sym (idl _)} ηₚ j
unique eta p other commutes = unique other $ ext commutes
colim→const-free : Colimit F → Free-object ConstD F
colim→const-free {F} colim = record where
open module colim = Colimit colim using (coapex; cocone)
open make-is-colimit (unmake-colimit colim.has-colimit)
free = coapex
unit = cocone
fold eta = universal (eta .η) λ f → eta .is-natural _ _ f ∙ idl _
commute {x} {nt} = ext λ j → factors (nt .η) λ _ → nt .is-natural _ _ _ ∙ idl _
unique {x} {nt} g p = unique (nt .η) (λ _ → nt .is-natural _ _ _ ∙ idl _) g
λ j → p ηₚ j
const-cofree→lim : Cofree-object ConstD F → Limit F
lim→const-cofree : Limit F → Cofree-object ConstD F-- this is better worked out explicitly
const-cofree→lim {F} cofree-ob = to-limit $ to-is-limit $ record where
open module cofree = Cofree-object cofree-ob
ψ = counit .η
universal {x} eta commutes = unfold {x} $ NT eta λ j k f → idr _ ∙ sym (commutes f)
commutes {j} {k} f = (sym $ counit .is-natural _ _ f) ∙ idr _
factors {j} eta p = commute {f = NT eta λ j k f → idr _ ∙ sym (p f) } ηₚ j
unique eta p other commutes = unique other $ ext commutes
lim→const-cofree {F} lim = record where
open Limit lim using (apex; cone)
open make-is-limit (unmake-limit (Limit.has-limit lim))
cofree = apex
counit = cone
unfold eta = universal (eta .η) λ f → sym (eta .is-natural _ _ f) ∙ idr _
commute {x} {nt} = ext λ j → factors (nt .η) λ _ → sym (nt .is-natural _ _ _)
∙ idr _
unique {x} {nt} g p = unique (nt .η) (λ _ → sym (nt .is-natural _ _ _) ∙ idr _) g
λ j → p ηₚ jThe (Co)limit functor🔗
Any functor which is a right (resp: left) colimit to computes as (co)limits.
const-adj→has-colimits-of-shape
: ∀ {J : Precategory o' ℓ'} {Colim} → (Colim ⊣ ConstD {C = C} {J = J})
→ (F : Functor J C) → Colimit F
const-adj→has-colimits-of-shape has-adj =
const-free→colim ⊙ left-adjoint→free-objects has-adj
const-adj→has-limits-of-shape
: ∀ {J : Precategory o' ℓ'} {Lim} → (ConstD {C = C} {J = J} ⊣ Lim)
→ (F : Functor J C) → Limit F
const-adj→has-limits-of-shape has-adj =
const-cofree→lim ⊙ right-adjoint→cofree-objects has-adjThus, any category which has adjoints to its generalized diagonal functor for any is (co)complete.
has-const-adjs→is-cocomplete : ∀ {o' ℓ'} → ({J : Precategory o' ℓ'} → Σ[ Colim ∈ Functor _ C ] Colim ⊣ ConstD {C = C} {J = J}) → is-cocomplete o' ℓ' C
has-const-adjs→is-cocomplete adjs = const-adj→has-colimits-of-shape (adjs .snd)
has-const-adjs→is-complete : ∀ {o' ℓ'} → ({J : Precategory o' ℓ'} → Σ[ Lim ∈ Functor _ C ] ConstD {C = C} {J = J} ⊣ Lim) → is-complete o' ℓ' C
has-const-adjs→is-complete adjs = const-adj→has-limits-of-shape (adjs .snd)