module Cat.Diagram.Monad.Limits {o β„“} {C : Precategory o β„“} {M : Monad C} where

Limits in categories of algebrasπŸ”—

Suppose that be a category, be a monad on and be a diagram of (that is, a functor into the Eilenberg-Moore category of M). Suppose that an evil wizard has given you a limit for the diagram in which underlies but they have not (being evil and all) told you whether admits an algebra structure at all.

Perhaps we can make this situation slightly more concrete, by working in a category equivalent to an Eilenberg-Moore category: If we have two groups considered as a discrete diagram, then the limit our evil wizard would give us is the product in But we already know we can equip this product with a β€œpointwise” group structure! Does this result generalise?

The answer is positive, though this is one of those cases where abstract nonsense can not help us: gotta roll up our sleeves and calculate away. Suppose we have a diagram as in the setup β€” we’ll show that the functor both preserves and reflects limits, in that is a limiting cone if, and only if, is.

That preserves limits follows immediately from the fact that it is a right adjoint: the non-trivial part is showing that it reflects them.

  Forget-EM-preserves-limits : preserves-limit Forget-EM F
  Forget-EM-preserves-limits = right-adjoint-is-continuous Free-EM⊣Forget-EM

We begin with the following key lemma: Write for the limit of a diagram If carries an structure and the limit projections are morphisms, then is the limit of in

  make-algebra-limit
    : βˆ€ {K : Functor ⊀Cat C} {eps : K F∘ !F => Forget-EM F∘ F}
    β†’ (lim : is-ran !F (Forget-EM F∘ F) K eps)
    β†’ (nu : Algebra-on C M (K .Fβ‚€ tt))
    β†’ (βˆ€ j β†’ is-limit.ψ lim j C.∘ nu .Ξ½ ≑ FAlg.Ξ½ j C.∘ M.M₁ (is-limit.ψ lim j))
    β†’ make-is-limit F (K .Fβ‚€ tt , nu)
  make-algebra-limit lim apex-alg comm = em-lim where
    module lim = is-limit lim
    open make-is-limit
    module apex = Algebra-on apex-alg
    open _=>_

The assumptions to this lemma are actually rather hefty: they pretty much directly say that was already the limit of However, with this more β€œelementary” rephrasing, we gain a bit of extra control which will be necessary for constructing limits in out of limits in later.

    em-lim : make-is-limit F _
    em-lim .ψ j .hom = lim.ψ j
    em-lim .ψ j .preserves = comm j
    em-lim .commutes f    = ext (lim.commutes f)
    em-lim .universal eps p .hom =
      lim.universal (Ξ» j β†’ eps j .hom) (Ξ» f i β†’ p f i .hom)
    em-lim .factors eps p =
      ext (lim.factors _ _)
    em-lim .unique eps p other q =
      ext (lim.unique _ _ _ Ξ» j i β†’ q j i .hom)
    em-lim .universal eps p .preserves = lim.uniqueβ‚‚ _
      (Ξ» f β†’ C.pulll (F.F₁ f .preserves)
           βˆ™ C.pullr (sym (M.M-∘ _ _) βˆ™ ap M.M₁ (ap hom (p f))))
      (Ξ» j β†’ C.pulll (lim.factors _ _)
           βˆ™ eps j .preserves)
      (Ξ» j β†’ C.pulll (comm j)
           βˆ™ C.pullr (sym (M.M-∘ _ _) βˆ™ ap M.M₁ (lim.factors _ _)))

This key lemma also doubles as a proof that the underlying object functor reflects limits: We already had an algebra structure β€œupstairs”!

  Forget-reflects-limits : reflects-limit Forget-EM F
  Forget-reflects-limits {K} {eps} lim = to-is-limitp
    (make-algebra-limit lim (K .Fβ‚€ tt .snd) (Ξ» j β†’ eps .Ξ· j .preserves))
    trivial!

Having shown that reflects the property of being a limit, we now turn to showing it reflects limits in general. Using our key lemma, it will suffice to construct an algebra structure on then show that the projection maps extend to algebra homomorphisms.

  Forget-lift-limit : Limit (Forget-EM F∘ F) β†’ Limit F
  Forget-lift-limit lim-over = to-limit $ to-is-limit $ make-algebra-limit
    (Limit.has-limit lim-over) apex-algebra (Ξ» j β†’ lim-over.factors _ _)
    where
    module lim-over = Limit lim-over
    module lim = Ran lim-over

An algebra structure consists, centrally, of a map a map into the limit. Maps into limits are the happy case, since is essentially defined by a (natural) isomorphism between the sets and the latter limit being computed in We understand limits of sets very well: they’re (subsets of) sets of tuples!

Our algebra map is thus defined componentwise: Since we have a bunch of maps coming from the algebra structures on each we can β€œtuple” them into a big map Abusing notation slightly, we’re defining to be

    apex-algebra : Algebra-on C M lim-over.apex
    apex-algebra .Ξ½ =
      lim-over.universal (Ξ» j β†’ FAlg.Ξ½ j C.∘ M.M₁ (lim-over.ψ j)) comm where abstract
      comm : βˆ€ {x y} (f : J.Hom x y)
            β†’ F.₁ f .hom C.∘ FAlg.Ξ½ x C.∘ M.M₁ (lim-over.ψ x)
            ≑ FAlg.Ξ½ y C.∘ M.M₁ (lim-over.ψ y)
      comm {x} {y} f =
        F.₁ f .hom C.∘ FAlg.Ξ½ x C.∘ M.M₁ (lim-over.ψ x)        β‰‘βŸ¨ C.extendl (F.₁ f .preserves) βŸ©β‰‘
        FAlg.Ξ½ y C.∘ M.M₁ (F.₁ f .hom) C.∘ M.M₁ (lim-over.ψ x) β‰‘Λ˜βŸ¨ C.refl⟩∘⟨ M.M-∘ _ _ βŸ©β‰‘Λ˜
        FAlg.Ξ½ y C.∘ M.M₁ (F.₁ f .hom C.∘ lim-over.ψ x)        β‰‘βŸ¨ C.refl⟩∘⟨ ap M.M₁ (lim-over.commutes f) βŸ©β‰‘
        FAlg.Ξ½ y C.∘ M.M₁ (lim-over.ψ y)                            ∎

To show that really is an algebra structure, we’ll reason componentwise, too: we must show that is the identity map: but we can compute

The other condition, compatibility with multiplication, is analogous. Formally, the computation is a bit less pretty, but it’s no more complicated.
    apex-algebra .Ξ½-unit = lim-over.uniqueβ‚‚ _ lim-over.commutes
      (Ξ» j β†’ C.pulll (lim-over.factors _ _)
          Β·Β· C.pullr (sym $ M.unit.is-natural _ _ _)
          Β·Β· C.cancell (FAlg.Ξ½-unit j))
      (Ξ» j β†’ C.idr _)
    apex-algebra .Ξ½-mult = lim-over.uniqueβ‚‚ _
      (Ξ» f β†’ C.pulll $ C.pulll (F.₁ f .preserves)
           βˆ™ C.pullr (sym (M.M-∘ _ _) βˆ™ ap M.M₁ (lim-over.commutes f)))
      (Ξ» j β†’ C.pulll (lim-over.factors _ _)
          Β·Β· C.pullr (sym (M.M-∘ _ _) βˆ™ ap M.M₁ (lim-over.factors _ _) βˆ™ M.M-∘ _ _)
          Β·Β· C.extendl (FAlg.Ξ½-mult j)
          ·· ap (FAlg.ν j C.∘_) (M.mult.is-natural _ _ _)
          Β·Β· C.assoc _ _ _)
      (Ξ» j β†’ C.pulll (lim-over.factors _ _))

Putting our previous results together, we conclude by observing that, if is a complete category, then so is regardless of how ill-behaved the monad might be.

Eilenberg-Moore-is-complete
  : βˆ€ {a b} β†’ is-complete a b C β†’ is-complete a b (Eilenberg-Moore M)
Eilenberg-Moore-is-complete complete F =
  Forget-lift-limit F (complete _)