module Cat.Functor.Conservative where
private variable
: Level
o h oâ hâ : Precategory o h
C D J open Precategory
open Functor
open lifts-limit
open creates-limit
open lifts-colimit
open creates-colimit
open creates-lan
open creates-ran
Conservative functorsđ
We say a functor is conservative if it reflects isomorphisms. More concretely, if is some morphism and if is an iso in then must have already been an iso in
: Functor C D â Type _
is-conservative {C = C} {D = D} F =
is-conservative â {A B} {f : C .Hom A B}
â is-invertible D (F .Fâ f) â is-invertible C f
Conservative functors reflect (co)limits that they preserveđ
As a general fact, conservative functors reflect limits and colimits that they preserve (given that those (co)limits exist in the domain).
The rough proof sketch is as follows: let be some cone in such that is a limit in and a limit in of the same diagram that is preserved by By the universal property of there exists a map from the apex of to the apex of in Furthermore, as is a limit in becomes an isomorphism in The situation is summarised by the following diagram, which shows how maps cones in to cones in (the coloured cones are assumed to be limiting).
However,
is conservative, which implies that
was an isomorphism in
all along! This means that
must be a limit in
as well (see is-invertibleâis-limitp
).
module _ {F : Functor C D} (conservative : is-conservative F) where
private
open _=>_
module C = Cat C
module D = Cat D
module F = Func F
conservative-reflects-limits: â {Dia : Functor J C}
â Limit Dia
â preserves-limit F Dia
â reflects-limit F Dia
{K} {eps} FK-lim =
conservative-reflects-limits L-lim preserves
is-invertibleâis-limitp{K = Limit.Ext L-lim} {epsy = Limit.cone L-lim} (Limit.has-limit L-lim)
(eps .η) (λ f â sym (eps .is-natural _ _ f) â C.elimr (K .F-id)) refl
$ conservative
$ invert
where
module L-lim = Limit L-lim
module FL-lim = is-limit (preserves L-lim.has-limit)
module FK-lim = is-limit FK-lim
: D.Hom (F .Fâ L-lim.apex) (F .Fâ (K .Fâ tt))
uinv =
uinv .universal
FK-lim(λ j â F .Fâ (L-lim.Ï j))
(λ f â sym (F .F-â _ _) â ap (F .Fâ) (L-lim.commutes f))
: D.is-invertible (F .Fâ (L-lim.universal (eps .η) _))
invert =
invert .make-invertible uinv
D(FL-lim.uniqueâ FL-lim.Ï (λ j â FL-lim.commutes j)
(λ j â F.pulll (L-lim.factors _ _) â FK-lim.factors _ _)
(λ j â D.idr _))
(FK-lim.uniqueâ FK-lim.Ï (λ j â FK-lim.commutes j)
(λ j â D.pulll (FK-lim.factors _ _) â F.collapse (L-lim.factors _ _))
(λ j â D.idr _))
As a nice consequence, a conservative functor that lifts a certain class of limits also creates those limits.
conservative+liftsâcreates-limits: â {oj âj} {J : Precategory oj âj}
â lifts-limits-of J F â creates-limits-of J F
.has-lifts-limit = F-lifts
conservative+liftsâcreates-limits F-lifts .reflects lim =
conservative+liftsâcreates-limits F-lifts (lifted-lim .lifted) (liftsâpreserves-limit lifted-lim) lim
conservative-reflects-limits where lifted-lim = F-lifts (to-ran lim)
:
conservativeâequiv â {A B} {f : C .Hom A B}
â C.is-invertible f â D.is-invertible (F .Fâ f)
= prop-ext! F.F-map-invertible conservative
conservativeâequiv
: is-conservative F.op
conservative^op
conservative^op inv= invertibleâco-invertible C
$ conservative $ co-invertibleâinvertible D inv
Clearly, if
is conservative then so is
so the statement about colimits follows by duality.
conservative-reflects-colimits: â {Dia : Functor J C}
â Colimit Dia
â preserves-colimit F Dia
â reflects-colimit F Dia
conservative-reflects-colimits: â {Dia : Functor J C}
â Colimit Dia
â preserves-colimit F Dia
â reflects-colimit F Dia
{K} {eta} FK-colim =
conservative-reflects-colimits C-colim preserves
is-invertibleâis-colimitp{K = Colimit.Ext C-colim} {etay = Colimit.cocone C-colim} (Colimit.has-colimit C-colim)
(eta .η) (λ f â eta .is-natural _ _ f â C.eliml (K .F-id)) refl
$ conservative
$ invert
where
module C-colim = Colimit C-colim
module FC-colim = is-colimit (preserves C-colim.has-colimit)
module FK-colim = is-colimit FK-colim
: D.Hom (F .Fâ (K .Fâ tt)) (F .Fâ C-colim.coapex)
uinv =
uinv .universal
FK-colim(λ j â F .Fâ (C-colim.Ï j))
(λ f â sym (F .F-â _ _) â ap (F .Fâ) (C-colim.commutes f))
: D.is-invertible (F .Fâ (C-colim.universal (eta .η) _))
invert =
invert .make-invertible uinv
D(FK-colim.uniqueâ _ (λ j â FK-colim.commutes j)
(λ j â D.pullr (FK-colim.factors _ _) â F.collapse (C-colim.factors _ _))
(λ j â D.idl _))
(FC-colim.uniqueâ _ (λ j â FC-colim.commutes j)
(λ j â F.pullr (C-colim.factors _ _) â FK-colim.factors _ _)
(λ j â D.idl _))
conservative+liftsâcreates-colimits: â {oj âj} {J : Precategory oj âj}
â lifts-colimits-of J F â creates-colimits-of J F
.has-lifts-colimit = F-lifts
conservative+liftsâcreates-colimits F-lifts .reflects colim =
conservative+liftsâcreates-colimits F-lifts (lifted-colim .lifted) (liftsâpreserves-colimit lifted-colim) colim
conservative-reflects-colimits where lifted-colim = F-lifts (to-lan colim)
Conservative functors reflect Kan extensions that they preserveđ
We can generalise the results above to Kan extensions: conservative functors automatically reflect any Kan extensions that exist and that they preserve.
module _ {F : Functor C D} (conservative : is-conservative F) where
private
open _=>_
module C = Cat C
module D = Cat D
module F = Func F
conservative-reflects-ran: â {o â} {J' : Precategory o â} {p : Functor J J'} {Dia : Functor J C}
â Ran p Dia
â preserves-ran p Dia F
â reflects-ran p Dia F
conservative-reflects-lan: â {o â} {J' : Precategory o â} {p : Functor J J'} {Dia : Functor J C}
â Lan p Dia
â preserves-lan p Dia F
â reflects-lan p Dia F
We start with a lemma: if is a conservative functor and is a natural transformation such that is invertible, then is invertible; this is immediate from the fact that invertibility of natural transformations is a pointwise condition. Concisely, this means that the postcomposition functor is conservative if is.
conservativeâpostcompose-conservative: â {o â} {E : Precategory o â}
â is-conservative (postcompose F {D = E})
=
conservativeâpostcompose-conservative inv _ λ d â
invertibleâinvertibleâż (is-invertibleâżâis-invertible inv d) conservative
The idea is then the same as for (co)limits.
{p = p} {Dia} L-ran preserves {K} {eps} FK-ran =
conservative-reflects-ran (Ran.has-ran L-ran)
is-invertibleâis-ran
$ conservativeâpostcompose-conservative invertwhere
module L-ran = Ran L-ran
module FL-ran = is-ran (preserves L-ran.has-ran)
module FK-ran = is-ran FK-ran
: (F Fâ L-ran.Ext) Fâ p => F Fâ Dia
F-eps = nat-assoc-from (F âž L-ran.eps)
F-eps
: F Fâ L-ran.Ext => F Fâ K
uinv = FK-ran.Ï F-eps
uinv
: is-invertibleâż (F âž L-ran.Ï eps)
invert = make-invertible _ uinv
invert (FL-ran.Ï-uniqâ F-eps
(ext λ j â sym $ F.pulll (L-ran.Ï-comm ηâ j) â FK-ran.Ï-comm ηâ j)
(ext λ j â sym (D.idr _)))
(FK-ran.Ï-uniqâ (nat-assoc-from (F âž eps))
(ext λ j â sym $ D.pulll (FK-ran.Ï-comm ηâ j) â F.collapse (L-ran.Ï-comm ηâ j))
(ext λ j â sym (D.idr _)))
{p = p} {Dia} L-lan preserves {K} {eta} FK-lan =
conservative-reflects-lan (Lan.has-lan L-lan)
is-invertibleâis-lan
$ conservativeâpostcompose-conservative invertwhere
module L-lan = Lan L-lan
module FL-lan = is-lan (preserves L-lan.has-lan)
module FK-lan = is-lan FK-lan
: F Fâ Dia => (F Fâ L-lan.Ext) Fâ p
F-eta = nat-assoc-to (F âž L-lan.eta)
F-eta
: F Fâ K => F Fâ L-lan.Ext
uinv = FK-lan.Ï F-eta
uinv
: is-invertibleâż (F âž L-lan.Ï eta)
invert = make-invertible _ uinv
invert (FK-lan.Ï-uniqâ (nat-assoc-to (F âž eta))
(ext λ j â sym $ D.pullr (FK-lan.Ï-comm ηâ j) â F.collapse (L-lan.Ï-comm ηâ j))
(ext λ j â sym (D.idl _)))
(FL-lan.Ï-uniqâ F-eta
(ext λ j â sym $ F.pullr (L-lan.Ï-comm ηâ j) â FK-lan.Ï-comm ηâ j)
(ext λ j â sym (D.idl _)))
conservative+liftsâcreates-ran: â {o â} {J' : Precategory o â} {p : Functor J J'}
â lifts-ran-along p F â creates-ran-along p F
.has-lifts-ran = F-lifts
conservative+liftsâcreates-ran F-lifts .reflects ran =
conservative+liftsâcreates-ran F-lifts .lifted (liftsâpreserves-ran lifted-ran) ran
conservative-reflects-ran lifted-ranwhere
= F-lifts (to-ran ran)
lifted-ran module lifted-ran = lifts-ran lifted-ran
conservative+liftsâcreates-lan: â {o â} {J' : Precategory o â} {p : Functor J J'}
â lifts-lan-along p F â creates-lan-along p F
.has-lifts-lan = F-lifts
conservative+liftsâcreates-lan F-lifts .reflects lan =
conservative+liftsâcreates-lan F-lifts .lifted (liftsâpreserves-lan lifted-lan) lan
conservative-reflects-lan lifted-lanwhere
= F-lifts (to-lan lan)
lifted-lan module lifted-lan = lifts-lan lifted-lan