Documentation

Mathlib.CategoryTheory.Limits.FunctorCategory.Basic

(Co)limits in functor categories. #

We show that if D has limits, then the functor category C ⥤ D also has limits (CategoryTheory.Limits.functorCategoryHasLimits), and the evaluation functors preserve limits (CategoryTheory.Limits.evaluation_preservesLimits) (and similarly for colimits).

We also show that F : D ⥤ K ⥤ C preserves (co)limits if it does so for each k : K (CategoryTheory.Limits.preservesLimits_of_evaluation and CategoryTheory.Limits.preservesColimits_of_evaluation).

@[simp]
theorem CategoryTheory.Limits.limit.lift_π_app {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (H : Functor J (Functor K C)) [HasLimit H] (c : Cone H) (j : J) (k : K) :
CategoryStruct.comp ((lift H c).app k) ((π H j).app k) = (c.app j).app k
@[simp]
theorem CategoryTheory.Limits.limit.lift_π_app_assoc {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (H : Functor J (Functor K C)) [HasLimit H] (c : Cone H) (j : J) (k : K) {Z : C} (h : (H.obj j).obj k Z) :
CategoryStruct.comp ((lift H c).app k) (CategoryStruct.comp ((π H j).app k) h) = CategoryStruct.comp ((c.app j).app k) h
@[simp]
theorem CategoryTheory.Limits.colimit.ι_desc_app {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (H : Functor J (Functor K C)) [HasColimit H] (c : Cocone H) (j : J) (k : K) :
CategoryStruct.comp ((ι H j).app k) ((desc H c).app k) = (c.app j).app k
@[simp]
theorem CategoryTheory.Limits.colimit.ι_desc_app_assoc {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (H : Functor J (Functor K C)) [HasColimit H] (c : Cocone H) (j : J) (k : K) {Z : C} (h : c.pt.obj k Z) :
CategoryStruct.comp ((ι H j).app k) (CategoryStruct.comp ((desc H c).app k) h) = CategoryStruct.comp ((c.app j).app k) h
def CategoryTheory.Limits.evaluationJointlyReflectsLimits {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] {F : Functor J (Functor K C)} (c : Cone F) (t : (k : K) → IsLimit (((evaluation K C).obj k).mapCone c)) :

The evaluation functors jointly reflect limits: that is, to show a cone is a limit of F it suffices to show that each evaluation cone is a limit. In other words, to prove a cone is limiting you can show it's pointwise limiting.

Equations
  • One or more equations did not get rendered due to their size.
Instances For
    def CategoryTheory.Limits.combineCones {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → LimitCone (F.flip.obj k)) :

    Given a functor F and a collection of limit cones for each diagram X ↦ F X k, we can stitch them together to give a cone for the diagram F. combinedIsLimit shows that the new cone is limiting, and evalCombined shows it is (essentially) made up of the original cones.

    Equations
    • One or more equations did not get rendered due to their size.
    Instances For
      @[simp]
      theorem CategoryTheory.Limits.combineCones_pt_obj {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → LimitCone (F.flip.obj k)) (k : K) :
      (combineCones F c).pt.obj k = (c k).cone.pt
      @[simp]
      theorem CategoryTheory.Limits.combineCones_pt_map {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → LimitCone (F.flip.obj k)) {k₁ k₂ : K} (f : k₁ k₂) :
      (combineCones F c).pt.map f = (c k₂).isLimit.lift { pt := (c k₁).cone.pt, π := CategoryStruct.comp (c k₁).cone (F.flip.map f) }
      @[simp]
      theorem CategoryTheory.Limits.combineCones_π_app_app {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → LimitCone (F.flip.obj k)) (j : J) (k : K) :
      ((combineCones F c).app j).app k = (c k).cone.app j
      def CategoryTheory.Limits.evaluateCombinedCones {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → LimitCone (F.flip.obj k)) (k : K) :
      ((evaluation K C).obj k).mapCone (combineCones F c) (c k).cone

      The stitched together cones each project down to the original given cones (up to iso).

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For
        def CategoryTheory.Limits.combinedIsLimit {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → LimitCone (F.flip.obj k)) :

        Stitching together limiting cones gives a limiting cone.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          def CategoryTheory.Limits.evaluationJointlyReflectsColimits {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] {F : Functor J (Functor K C)} (c : Cocone F) (t : (k : K) → IsColimit (((evaluation K C).obj k).mapCocone c)) :

          The evaluation functors jointly reflect colimits: that is, to show a cocone is a colimit of F it suffices to show that each evaluation cocone is a colimit. In other words, to prove a cocone is colimiting you can show it's pointwise colimiting.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            def CategoryTheory.Limits.combineCocones {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → ColimitCocone (F.flip.obj k)) :

            Given a functor F and a collection of colimit cocones for each diagram X ↦ F X k, we can stitch them together to give a cocone for the diagram F. combinedIsColimit shows that the new cocone is colimiting, and evalCombined shows it is (essentially) made up of the original cocones.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For
              @[simp]
              theorem CategoryTheory.Limits.combineCocones_pt_map {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → ColimitCocone (F.flip.obj k)) {k₁ k₂ : K} (f : k₁ k₂) :
              (combineCocones F c).pt.map f = (c k₁).isColimit.desc { pt := (c k₂).cocone.pt, ι := CategoryStruct.comp (F.flip.map f) (c k₂).cocone }
              @[simp]
              theorem CategoryTheory.Limits.combineCocones_pt_obj {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → ColimitCocone (F.flip.obj k)) (k : K) :
              (combineCocones F c).pt.obj k = (c k).cocone.pt
              @[simp]
              theorem CategoryTheory.Limits.combineCocones_ι_app_app {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → ColimitCocone (F.flip.obj k)) (j : J) (k : K) :
              ((combineCocones F c).app j).app k = (c k).cocone.app j
              def CategoryTheory.Limits.evaluateCombinedCocones {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → ColimitCocone (F.flip.obj k)) (k : K) :
              ((evaluation K C).obj k).mapCocone (combineCocones F c) (c k).cocone

              The stitched together cocones each project down to the original given cocones (up to iso).

              Equations
              • One or more equations did not get rendered due to their size.
              Instances For
                def CategoryTheory.Limits.combinedIsColimit {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (c : (k : K) → ColimitCocone (F.flip.obj k)) :

                Stitching together colimiting cocones gives a colimiting cocone.

                Equations
                • One or more equations did not get rendered due to their size.
                Instances For

                  An alternative colimit cocone in the functor category K ⥤ C in the case where C has J-shaped colimits, with cocone point F.flip ⋙ colim.

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For
                    @[simp]
                    theorem CategoryTheory.Limits.pointwiseCocone_ι_app_app {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] [HasColimitsOfShape J C] (F : Functor J (Functor K C)) (X : J) (Y : K) :
                    ((pointwiseCocone F).app X).app Y = colimit.ι (F.flip.obj Y) X

                    pointwiseCocone is indeed a colimit cocone.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      instance CategoryTheory.Limits.functorCategoryHasLimit {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) [∀ (k : K), HasLimit (F.flip.obj k)] :
                      instance CategoryTheory.Limits.functorCategoryHasColimit {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) [∀ (k : K), HasColimit (F.flip.obj k)] :
                      instance CategoryTheory.Limits.hasLimitCompEvaluation {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (k : K) [HasLimit (F.flip.obj k)] :
                      HasLimit (F.comp ((evaluation K C).obj k))
                      instance CategoryTheory.Limits.evaluation_preservesLimit {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) [∀ (k : K), HasLimit (F.flip.obj k)] (k : K) :
                      PreservesLimit F ((evaluation K C).obj k)
                      def CategoryTheory.Limits.limitObjIsoLimitCompEvaluation {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] [HasLimitsOfShape J C] (F : Functor J (Functor K C)) (k : K) :
                      (limit F).obj k limit (F.comp ((evaluation K C).obj k))

                      If F : J ⥤ K ⥤ C is a functor into a functor category which has a limit, then the evaluation of that limit at k is the limit of the evaluations of F.obj j at k.

                      Equations
                      Instances For
                        @[simp]
                        theorem CategoryTheory.Limits.limitObjIsoLimitCompEvaluation_hom_π_assoc {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] [HasLimitsOfShape J C] (F : Functor J (Functor K C)) (j : J) (k : K) {Z : C} (h : ((evaluation K C).obj k).obj (F.obj j) Z) :
                        @[simp]
                        theorem CategoryTheory.Limits.limitObjIsoLimitCompEvaluation_inv_π_app_assoc {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] [HasLimitsOfShape J C] (F : Functor J (Functor K C)) (j : J) (k : K) {Z : C} (h : (F.obj j).obj k Z) :
                        theorem CategoryTheory.Limits.limit_obj_ext {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] {H : Functor J (Functor K C)} [HasLimitsOfShape J C] {k : K} {W : C} {f g : W (limit H).obj k} (w : ∀ (j : J), CategoryStruct.comp f ((limit.π H j).app k) = CategoryStruct.comp g ((limit.π H j).app k)) :
                        f = g
                        def CategoryTheory.Limits.limitCompWhiskeringLeftIsoCompLimit {C : Type u} [Category.{v, u} C] {D : Type u'} [Category.{v', u'} D] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (G : Functor D K) [HasLimitsOfShape J C] :
                        limit (F.comp ((whiskeringLeft D K C).obj G)) G.comp (limit F)

                        Taking a limit after whiskering by G is the same as using G and then taking a limit.

                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For
                          instance CategoryTheory.Limits.hasColimitCompEvaluation {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) (k : K) [HasColimit (F.flip.obj k)] :
                          HasColimit (F.comp ((evaluation K C).obj k))
                          instance CategoryTheory.Limits.evaluation_preservesColimit {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor J (Functor K C)) [∀ (k : K), HasColimit (F.flip.obj k)] (k : K) :

                          If F : J ⥤ K ⥤ C is a functor into a functor category which has a colimit, then the evaluation of that colimit at k is the colimit of the evaluations of F.obj j at k.

                          Equations
                          Instances For
                            theorem CategoryTheory.Limits.colimit_obj_ext {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] {H : Functor J (Functor K C)} [HasColimitsOfShape J C] {k : K} {W : C} {f g : (colimit H).obj k W} (w : ∀ (j : J), CategoryStruct.comp ((colimit.ι H j).app k) f = CategoryStruct.comp ((colimit.ι H j).app k) g) :
                            f = g

                            Taking a colimit after whiskering by G is the same as using G and then taking a colimit.

                            Equations
                            • One or more equations did not get rendered due to their size.
                            Instances For
                              theorem CategoryTheory.Limits.preservesLimit_of_evaluation {C : Type u} [Category.{v, u} C] {D : Type u'} [Category.{v', u'} D] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor D (Functor K C)) (G : Functor J D) (H : ∀ (k : K), PreservesLimit G (F.comp ((evaluation K C).obj k))) :

                              F : D ⥤ K ⥤ C preserves the limit of some G : J ⥤ D if it does for each k : K.

                              @[deprecated "No deprecation message was provided." (since := "2024-11-19")]
                              theorem CategoryTheory.Limits.preservesLimitOfEvaluation {C : Type u} [Category.{v, u} C] {D : Type u'} [Category.{v', u'} D] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor D (Functor K C)) (G : Functor J D) (H : ∀ (k : K), PreservesLimit G (F.comp ((evaluation K C).obj k))) :

                              F : D ⥤ K ⥤ C preserves limits of shape J if it does for each k : K.

                              @[deprecated "No deprecation message was provided." (since := "2024-11-19")]

                              F : D ⥤ K ⥤ C preserves all limits if it does for each k : K.

                              @[deprecated "No deprecation message was provided." (since := "2024-11-19")]
                              theorem CategoryTheory.Limits.preservesColimit_of_evaluation {C : Type u} [Category.{v, u} C] {D : Type u'} [Category.{v', u'} D] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor D (Functor K C)) (G : Functor J D) (H : ∀ (k : K), PreservesColimit G (F.comp ((evaluation K C).obj k))) :

                              F : D ⥤ K ⥤ C preserves the colimit of some G : J ⥤ D if it does for each k : K.

                              @[deprecated "No deprecation message was provided." (since := "2024-11-19")]
                              theorem CategoryTheory.Limits.preservesColimitOfEvaluation {C : Type u} [Category.{v, u} C] {D : Type u'} [Category.{v', u'} D] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] (F : Functor D (Functor K C)) (G : Functor J D) (H : ∀ (k : K), PreservesColimit G (F.comp ((evaluation K C).obj k))) :

                              F : D ⥤ K ⥤ C preserves all colimits of shape J if it does for each k : K.

                              F : D ⥤ K ⥤ C preserves all colimits if it does for each k : K.

                              The limit of a diagram F : J ⥤ K ⥤ C is isomorphic to the functor given by the individual limits on objects.

                              Equations
                              Instances For

                                A variant of limitIsoFlipCompLim where the arguments of F are flipped.

                                Equations
                                • One or more equations did not get rendered due to their size.
                                Instances For
                                  def CategoryTheory.Limits.limitIsoSwapCompLim {C : Type u} [Category.{v, u} C] {J : Type u₁} [Category.{v₁, u₁} J] {K : Type u₂} [Category.{v₂, u₂} K] [HasLimitsOfShape J C] (G : Functor J (Functor K C)) :
                                  limit G (curry.obj ((Prod.swap K J).comp (uncurry.obj G))).comp lim

                                  For a functor G : J ⥤ K ⥤ C, its limit K ⥤ C is given by (G' : K ⥤ J ⥤ C) ⋙ lim. Note that this does not require K to be small.

                                  Equations
                                  Instances For

                                    The colimit of a diagram F : J ⥤ K ⥤ C is isomorphic to the functor given by the individual colimits on objects.

                                    Equations
                                    Instances For

                                      A variant of colimit_iso_flip_comp_colim where the arguments of F are flipped.

                                      Equations
                                      • One or more equations did not get rendered due to their size.
                                      Instances For

                                        For a functor G : J ⥤ K ⥤ C, its colimit K ⥤ C is given by (G' : K ⥤ J ⥤ C) ⋙ colim. Note that this does not require K to be small.

                                        Equations
                                        • One or more equations did not get rendered due to their size.
                                        Instances For