module Cat.Functor.Conservative where

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

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 f

As 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 _))