module Cat.Functor.Conservative whereConservative 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
is-conservative : Functor C D → Type _
is-conservative {C = C} {D = D} F =
  ∀ {A B} {f : C .Hom A B}
  → is-invertible D (F .F₁ f) → is-invertible C fAs a general fact, conservative functors reflect limits that they preserve (given those limits exist in the first place!).
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. 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
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}
                               → (L : Limit Dia)
                               → preserves-limit F Dia
                               → reflects-limit F Dia
  conservative-reflects-limits L-lim preservesa {K} {eps} lim =
    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 (preservesa L-lim.has-limit)
      module lim = is-limit lim
      uinv : D.Hom (F .F₀ L-lim.apex) (F .F₀ (K .F₀ tt))
      uinv =
          (lim.universal
            (λ j → F .F₁ (L-lim.ψ j))
            (λ f → sym (F .F-∘ _ _) ∙ ap (F .F₁) (L-lim.commutes f)))
      invert : D.is-invertible (F .F₁ (L-lim.universal (eps .η) _))
      invert =
        D.make-invertible uinv
          (FL-lim.unique₂ _ (λ j → FL-lim.commutes j)
            (λ j → F.pulll (L-lim.factors _ _) ∙ lim.factors _ _)
            (λ j → D.idr _))
          (lim.unique₂ _ (λ j → lim.commutes j)
            (λ j → D.pulll (lim.factors _ _) ∙ F.collapse (L-lim.factors _ _))
            (λ j → D.idr _))