Theorem: CategoryTheory.Limits.IsColimit.OfNatIso.coconeOfHom_fac
File: Mathlib/CategoryTheory/Limits/IsLimit.lean

Proof steps:
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
⊢ coconeOfHom h f = (colimitCocone h).extend f
state_after: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
⊢ { pt := Y, ι := h.hom.app Y { down := f } } = { pt := Y, ι := h.hom.app X { down := 𝟙 X } ≫ (const J).map f }
tactic: dsimp [coconeOfHom, colimitCocone, Cocone.extend]
state_before: J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
⊢ { pt := Y, ι := h.hom.app Y { down := f } } = { pt := Y, ι := h.hom.app X { down := 𝟙 X } ≫ (const J).map f }
state_after: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
⊢ (h.hom.app Y { down := f }).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
tactic: congr with j
state_before: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
⊢ (h.hom.app Y { down := f }).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
state_after: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t✝ : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
t :
  ((coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃}).map f ≫ h.hom.app Y) { down := 𝟙 X } =
    (h.hom.app X ≫ F.cocones.map f) { down := 𝟙 X }
⊢ (h.hom.app Y { down := f }).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
tactic: have t := congrFun (h.hom.naturality f) ⟨𝟙 X⟩
state_before: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t✝ : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
t :
  ((coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃}).map f ≫ h.hom.app Y) { down := 𝟙 X } =
    (h.hom.app X ≫ F.cocones.map f) { down := 𝟙 X }
⊢ (h.hom.app Y { down := f }).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
state_after: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t✝ : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
t : h.hom.app Y { down := 𝟙 X ≫ f } = F.cocones.map f (h.hom.app X { down := 𝟙 X })
⊢ (h.hom.app Y { down := f }).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
tactic: dsimp at t
state_before: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t✝ : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
t : h.hom.app Y { down := 𝟙 X ≫ f } = F.cocones.map f (h.hom.app X { down := 𝟙 X })
⊢ (h.hom.app Y { down := f }).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
state_after: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t✝ : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
t : h.hom.app Y { down := f } = F.cocones.map f (h.hom.app X { down := 𝟙 X })
⊢ (h.hom.app Y { down := f }).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
tactic: simp only [id_comp] at t
state_before: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t✝ : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
t : h.hom.app Y { down := f } = F.cocones.map f (h.hom.app X { down := 𝟙 X })
⊢ (h.hom.app Y { down := f }).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
state_after: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t✝ : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
t : h.hom.app Y { down := f } = F.cocones.map f (h.hom.app X { down := 𝟙 X })
⊢ (F.cocones.map f (h.hom.app X { down := 𝟙 X })).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
tactic: rw [congrFun (congrArg NatTrans.app t) j]
state_before: case e_ι.w.h
J : Type u₁
inst✝² : Category.{v₁, u₁} J
K : Type u₂
inst✝¹ : Category.{v₂, u₂} K
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
t✝ : Cocone F
X : C
h : coyoneda.obj (op X) ⋙ uliftFunctor.{u₁, v₃} ≅ F.cocones
Y : C
f : X ⟶ Y
j : J
t : h.hom.app Y { down := f } = F.cocones.map f (h.hom.app X { down := 𝟙 X })
⊢ (F.cocones.map f (h.hom.app X { down := 𝟙 X })).app j = (h.hom.app X { down := 𝟙 X } ≫ (const J).map f).app j
state_after: no goals
tactic: rfl