# Limits and colimits in comma categories #

We build limits in the comma category Comma L R provided that the two source categories have limits and R preserves them. This is used to construct limits in the arrow category, structured arrow category and under category, and show that the appropriate forgetful functors create limits.

The duals of all the above are also given.

@[simp]
theorem CategoryTheory.Comma.limitAuxiliaryCone_π_app {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) (c₁ : CategoryTheory.Limits.Cone (F.comp ())) (X : J) :
.app X = CategoryTheory.CategoryStruct.comp (L.map (c₁.app X)) (F.obj X).hom
@[simp]
theorem CategoryTheory.Comma.limitAuxiliaryCone_pt {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) (c₁ : CategoryTheory.Limits.Cone (F.comp ())) :
.pt = L.obj c₁.pt
def CategoryTheory.Comma.limitAuxiliaryCone {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) (c₁ : CategoryTheory.Limits.Cone (F.comp ())) :
CategoryTheory.Limits.Cone ((F.comp ()).comp R)

(Implementation). An auxiliary cone which is useful in order to construct limits in the comma category.

Equations
• = (L.mapCone c₁)
Instances For
@[simp]
theorem CategoryTheory.Comma.coneOfPreserves_π_app_left {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesLimit (F.comp ()) R] (c₁ : CategoryTheory.Limits.Cone (F.comp ())) {c₂ : CategoryTheory.Limits.Cone (F.comp ())} (t₂ : ) (j : J) :
(().app j).left = c₁.app j
@[simp]
theorem CategoryTheory.Comma.coneOfPreserves_pt_hom {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesLimit (F.comp ()) R] (c₁ : CategoryTheory.Limits.Cone (F.comp ())) {c₂ : CategoryTheory.Limits.Cone (F.comp ())} (t₂ : ) :
().pt.hom =
@[simp]
theorem CategoryTheory.Comma.coneOfPreserves_pt_left {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesLimit (F.comp ()) R] (c₁ : CategoryTheory.Limits.Cone (F.comp ())) {c₂ : CategoryTheory.Limits.Cone (F.comp ())} (t₂ : ) :
().pt.left = c₁.pt
@[simp]
theorem CategoryTheory.Comma.coneOfPreserves_π_app_right {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesLimit (F.comp ()) R] (c₁ : CategoryTheory.Limits.Cone (F.comp ())) {c₂ : CategoryTheory.Limits.Cone (F.comp ())} (t₂ : ) (j : J) :
(().app j).right = c₂.app j
@[simp]
theorem CategoryTheory.Comma.coneOfPreserves_pt_right {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesLimit (F.comp ()) R] (c₁ : CategoryTheory.Limits.Cone (F.comp ())) {c₂ : CategoryTheory.Limits.Cone (F.comp ())} (t₂ : ) :
().pt.right = c₂.pt
def CategoryTheory.Comma.coneOfPreserves {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesLimit (F.comp ()) R] (c₁ : CategoryTheory.Limits.Cone (F.comp ())) {c₂ : CategoryTheory.Limits.Cone (F.comp ())} (t₂ : ) :

If R preserves the appropriate limit, then given a cone for F ⋙ fst L R : J ⥤ L and a limit cone for F ⋙ snd L R : J ⥤ R we can build a cone for F which will turn out to be a limit cone.

Equations
• One or more equations did not get rendered due to their size.
Instances For
def CategoryTheory.Comma.coneOfPreservesIsLimit {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesLimit (F.comp ()) R] {c₁ : CategoryTheory.Limits.Cone (F.comp ())} (t₁ : ) {c₂ : CategoryTheory.Limits.Cone (F.comp ())} (t₂ : ) :

Provided that R preserves the appropriate limit, then the cone in coneOfPreserves is a limit.

Equations
• One or more equations did not get rendered due to their size.
Instances For
@[simp]
theorem CategoryTheory.Comma.colimitAuxiliaryCocone_pt {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) (c₂ : CategoryTheory.Limits.Cocone (F.comp ())) :
= R.obj c₂.pt
@[simp]
theorem CategoryTheory.Comma.colimitAuxiliaryCocone_ι_app {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) (c₂ : CategoryTheory.Limits.Cocone (F.comp ())) (X : J) :
.app X = CategoryTheory.CategoryStruct.comp (F.obj X).hom (R.map (c₂.app X))
def CategoryTheory.Comma.colimitAuxiliaryCocone {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) (c₂ : CategoryTheory.Limits.Cocone (F.comp ())) :
CategoryTheory.Limits.Cocone ((F.comp ()).comp L)

(Implementation). An auxiliary cocone which is useful in order to construct colimits in the comma category.

Equations
• = (R.mapCocone c₂)
Instances For
@[simp]
theorem CategoryTheory.Comma.coconeOfPreserves_pt_left {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesColimit (F.comp ()) L] {c₁ : CategoryTheory.Limits.Cocone (F.comp ())} (t₁ : ) (c₂ : CategoryTheory.Limits.Cocone (F.comp ())) :
().pt.left = c₁.pt
@[simp]
theorem CategoryTheory.Comma.coconeOfPreserves_ι_app_left {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesColimit (F.comp ()) L] {c₁ : CategoryTheory.Limits.Cocone (F.comp ())} (t₁ : ) (c₂ : CategoryTheory.Limits.Cocone (F.comp ())) (j : J) :
(().app j).left = c₁.app j
@[simp]
theorem CategoryTheory.Comma.coconeOfPreserves_pt_right {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesColimit (F.comp ()) L] {c₁ : CategoryTheory.Limits.Cocone (F.comp ())} (t₁ : ) (c₂ : CategoryTheory.Limits.Cocone (F.comp ())) :
().pt.right = c₂.pt
@[simp]
theorem CategoryTheory.Comma.coconeOfPreserves_pt_hom {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesColimit (F.comp ()) L] {c₁ : CategoryTheory.Limits.Cocone (F.comp ())} (t₁ : ) (c₂ : CategoryTheory.Limits.Cocone (F.comp ())) :
().pt.hom =
@[simp]
theorem CategoryTheory.Comma.coconeOfPreserves_ι_app_right {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesColimit (F.comp ()) L] {c₁ : CategoryTheory.Limits.Cocone (F.comp ())} (t₁ : ) (c₂ : CategoryTheory.Limits.Cocone (F.comp ())) (j : J) :
(().app j).right = c₂.app j
def CategoryTheory.Comma.coconeOfPreserves {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesColimit (F.comp ()) L] {c₁ : CategoryTheory.Limits.Cocone (F.comp ())} (t₁ : ) (c₂ : CategoryTheory.Limits.Cocone (F.comp ())) :

If L preserves the appropriate colimit, then given a colimit cocone for F ⋙ fst L R : J ⥤ L and a cocone for F ⋙ snd L R : J ⥤ R we can build a cocone for F which will turn out to be a colimit cocone.

Equations
• One or more equations did not get rendered due to their size.
Instances For
def CategoryTheory.Comma.coconeOfPreservesIsColimit {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.PreservesColimit (F.comp ()) L] {c₁ : CategoryTheory.Limits.Cocone (F.comp ())} (t₁ : ) {c₂ : CategoryTheory.Limits.Cocone (F.comp ())} (t₂ : ) :

Provided that L preserves the appropriate colimit, then the cocone in coconeOfPreserves is a colimit.

Equations
• One or more equations did not get rendered due to their size.
Instances For
instance CategoryTheory.Comma.hasLimit {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.HasLimit (F.comp ())] [CategoryTheory.Limits.HasLimit (F.comp ())] [CategoryTheory.Limits.PreservesLimit (F.comp ()) R] :
Equations
• =
instance CategoryTheory.Comma.hasLimitsOfShape {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } :
Equations
• =
instance CategoryTheory.Comma.hasLimitsOfSize {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } [] [] [] :
Equations
• =
instance CategoryTheory.Comma.hasColimit {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } (F : ) [CategoryTheory.Limits.HasColimit (F.comp ())] [CategoryTheory.Limits.HasColimit (F.comp ())] [CategoryTheory.Limits.PreservesColimit (F.comp ()) L] :
Equations
• =
instance CategoryTheory.Comma.hasColimitsOfShape {J : Type w} {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } :
Equations
• =
instance CategoryTheory.Comma.hasColimitsOfSize {A : Type u₁} [] {B : Type u₂} [] {T : Type u₃} [] {L : } {R : } [] [] [] :
Equations
• =
instance CategoryTheory.Arrow.hasLimit {J : Type w} {T : Type u₃} [] (F : ) [i₁ : CategoryTheory.Limits.HasLimit (F.comp CategoryTheory.Arrow.leftFunc)] [i₂ : CategoryTheory.Limits.HasLimit (F.comp CategoryTheory.Arrow.rightFunc)] :
Equations
• =
instance CategoryTheory.Arrow.hasLimitsOfShape {J : Type w} {T : Type u₃} [] :
Equations
• =
Equations
• =
instance CategoryTheory.Arrow.hasColimit {J : Type w} {T : Type u₃} [] (F : ) [i₁ : CategoryTheory.Limits.HasColimit (F.comp CategoryTheory.Arrow.leftFunc)] [i₂ : CategoryTheory.Limits.HasColimit (F.comp CategoryTheory.Arrow.rightFunc)] :
Equations
• =
instance CategoryTheory.Arrow.hasColimitsOfShape {J : Type w} {T : Type u₃} [] :
Equations
• =
Equations
• =
instance CategoryTheory.StructuredArrow.hasLimit {J : Type w} {A : Type u₁} [] {T : Type u₃} [] {X : T} {G : } (F : ) [i₁ : ] [i₂ : ] :
Equations
• =
instance CategoryTheory.StructuredArrow.hasLimitsOfShape {J : Type w} {A : Type u₁} [] {T : Type u₃} [] {X : T} {G : } :
Equations
• =
instance CategoryTheory.StructuredArrow.hasLimitsOfSize {A : Type u₁} [] {T : Type u₃} [] {X : T} {G : } [] [] :
Equations
• =
noncomputable instance CategoryTheory.StructuredArrow.createsLimit {J : Type w} {A : Type u₁} [] {T : Type u₃} [] {X : T} {G : } (F : ) [i : ] :
Equations
• One or more equations did not get rendered due to their size.
noncomputable instance CategoryTheory.StructuredArrow.createsLimitsOfShape {J : Type w} {A : Type u₁} [] {T : Type u₃} [] {X : T} {G : } :
Equations
• CategoryTheory.StructuredArrow.createsLimitsOfShape = { CreatesLimit := fun {K : } => inferInstance }
noncomputable instance CategoryTheory.StructuredArrow.createsLimitsOfSize {A : Type u₁} [] {T : Type u₃} [] {X : T} {G : } [] :
Equations
• CategoryTheory.StructuredArrow.createsLimitsOfSize = { CreatesLimitsOfShape := fun {J : Type w'} [] => inferInstance }
instance CategoryTheory.StructuredArrow.mono_right_of_mono {A : Type u₁} [] {T : Type u₃} [] {X : T} {G : } {Y : } {Z : } (f : Y Z) :
Equations
• =
theorem CategoryTheory.StructuredArrow.mono_iff_mono_right {A : Type u₁} [] {T : Type u₃} [] {X : T} {G : } {Y : } {Z : } (f : Y Z) :
instance CategoryTheory.CostructuredArrow.hasColimit {J : Type w} {A : Type u₁} [] {T : Type u₃} [] {G : } {X : T} (F : ) [i₁ : ] [i₂ : ] :
Equations
• =
instance CategoryTheory.CostructuredArrow.hasColimitsOfShape {J : Type w} {A : Type u₁} [] {T : Type u₃} [] {G : } {X : T} :
Equations
• =
instance CategoryTheory.CostructuredArrow.hasColimitsOfSize {A : Type u₁} [] {T : Type u₃} [] {G : } {X : T} [] [] :
Equations
• =
noncomputable instance CategoryTheory.CostructuredArrow.createsColimit {J : Type w} {A : Type u₁} [] {T : Type u₃} [] {G : } {X : T} (F : ) [i : ] :
Equations
• One or more equations did not get rendered due to their size.
noncomputable instance CategoryTheory.CostructuredArrow.createsColimitsOfShape {J : Type w} {A : Type u₁} [] {T : Type u₃} [] {G : } {X : T} :
Equations
• CategoryTheory.CostructuredArrow.createsColimitsOfShape = { CreatesColimit := fun {K : } => inferInstance }
noncomputable instance CategoryTheory.CostructuredArrow.createsColimitsOfSize {A : Type u₁} [] {T : Type u₃} [] {G : } {X : T} [] :
Equations
• CategoryTheory.CostructuredArrow.createsColimitsOfSize = { CreatesColimitsOfShape := fun {J : Type w'} [] => inferInstance }
instance CategoryTheory.CostructuredArrow.epi_left_of_epi {A : Type u₁} [] {T : Type u₃} [] {G : } {X : T} {Y : } {Z : } (f : Y Z) :
Equations
• =
theorem CategoryTheory.CostructuredArrow.epi_iff_epi_left {A : Type u₁} [] {T : Type u₃} [] {G : } {X : T} {Y : } {Z : } (f : Y Z) :