module Cat.Instances.Functor.Limits where

Limits in functor categories🔗

Let be a category admitting limits. Then the functor category for any category, also admits limits. In particular, if is then so is

module _
  {o₁ ℓ₁} {C : Precategory o₁ ℓ₁}
  {o₂ ℓ₂} {D : Precategory o₂ ℓ₂}
  {o₃ ℓ₃} {E : Precategory o₃ ℓ₃}
  (has-D-lims : (F : Functor D C) → Limit F)
  (F : Functor D Cat[ E , C ])
  where

Let be a diagram, and suppose admits limits of diagrams; We wish to compute the limit First, observe that we can Uncurry to obtain a functor By fixing the value of the coordinate (say, to we obtain a family of diagrams in which, by assumption, all have limits.

    F-uncurried : Functor (D ×ᶜ E) C
    F-uncurried = Uncurry {C = D} {D = E} {E = C} F

    import Cat.Functor.Bifunctor {C = D} {D = E} {E = C} F-uncurried as F'
    module D-lim x = Limit (has-D-lims (F'.Left x))

Let us call the limit of — taken in — lim-for, and similarly the unique, “terminating” cone homomorphism will be called !-for.

    !-for : ∀ {x y} (f : E.Hom x y) → C.Hom (D-lim.apex x) (D-lim.apex y)
    !-for {x} {y} f =
      D-lim.universal y
        (λ j → F'.Right j .F₁ f C.∘ D-lim.ψ x j)
        (λ g →
          C.extendl F'.first∘second
          ∙ ap₂ C._∘_ refl (D-lim.commutes x g))

    functor-apex : Functor E C
    functor-apex .F₀ x = D-lim.apex x
    functor-apex .F₁ {x} {y} f = !-for f
    functor-apex .F-id =
      sym $ D-lim.unique _ _ _ _ λ j →
        C.idr _ ∙ sym (D-lim.commutes _ _)
    functor-apex .F-∘ f g =
      sym $ D-lim.unique _ _ _ _ λ j →
        C.pulll (D-lim.factors _ _ _)
        ∙ C.pullr (D-lim.factors _ _ _)
        ∙ C.pulll (sym (F'.Right _ .F-∘ _ _))

  functor-limit : Limit F
  functor-limit = to-limit $ to-is-limit ml where
    open make-is-limit

    ml : make-is-limit F functor-apex
    ml .ψ j .η x = D-lim.ψ x j
    ml .ψ j .is-natural x y f =
      D-lim.factors _ _ _ ∙ ap₂ C._∘_ (C.eliml (F.F-id ηₚ _)) refl
    ml .commutes f = ext λ j →
      C.pushr (C.introl (F.₀ _ .F-id)) ∙ D-lim.commutes j f
    ml .universal eps p .η x = D-lim.universal x
      (λ j → eps j .η x)
      (λ f → ap₂ C._∘_ (C.elimr (F.₀ _ .F-id)) refl ∙ p f ηₚ x)
    ml .universal eps p .is-natural x y f = D-lim.unique₂ y _
      (λ g → C.pulll (ap₂ C._∘_ (C.elimr (F.₀ _ .F-id)) refl ∙ p g ηₚ y))
      (λ j → C.pulll (D-lim.factors _ _ _))
      (λ j →
          C.pulll (D-lim.factors _ _ _)
        ∙ C.pullr (D-lim.factors _ _ _)
        ∙ ap₂ C._∘_ (C.eliml (F.F-id ηₚ _)) refl
        ∙ sym (eps j .is-natural x y f))
    ml .factors eps p = ext λ j →
      D-lim.factors j _ _
    ml .unique eps p other q = ext λ x →
      D-lim.unique _ _ _ _ λ j → q j ηₚ x

As a corollary, if is an category, then so is

Functor-cat-is-complete :
  ∀ {o ℓ} {o₁ ℓ₁} {C : Precategory o₁ ℓ₁} {o₂ ℓ₂} {D : Precategory o₂ ℓ₂}
  → is-complete o ℓ D → is-complete o ℓ Cat[ C , D ]
Functor-cat-is-complete D-complete = functor-limit D-complete