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 and colimits that they preserve (given those (co)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 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 assumes 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
  conservative-reflects-limits L-lim preservesa {K} {eps} FK-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 FK-lim = is-limit FK-lim

      uinv : D.Hom (F .Fβ‚€ L-lim.apex) (F .Fβ‚€ (K .Fβ‚€ tt))
      uinv =
        FK-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 _ _) βˆ™ FK-lim.factors _ _)
            (Ξ» j β†’ D.idr _))
          (FK-lim.uniqueβ‚‚ _ (Ξ» j β†’ FK-lim.commutes j)
            (Ξ» j β†’ D.pulll (FK-lim.factors _ _) βˆ™ F.collapse (L-lim.factors _ _))
            (Ξ» j β†’ D.idr _))

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 C-colim preservesa {K} {eta} FK-colim =
    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 (preservesa C-colim.has-colimit)
      module FK-colim = is-colimit FK-colim

      uinv : D.Hom (F .Fβ‚€ (K .Fβ‚€ tt)) (F .Fβ‚€ C-colim.coapex)
      uinv =
        FK-colim.universal
          (Ξ» j β†’ F .F₁ (C-colim.ψ j))
          (Ξ» f β†’ sym (F .F-∘ _ _) βˆ™ ap (F .F₁) (C-colim.commutes f))

      invert : D.is-invertible (F .F₁ (C-colim.universal (eta .Ξ·) _))
      invert =
        D.make-invertible uinv
          (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 _))