Theorem: CategoryTheory.Limits.IsLimit.OfNatIso.coneOfHom_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 : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
⊢ coneOfHom h f = (limitCone 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 : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
⊢ { pt := Y, π := h.hom.app (op Y) { down := f } } =
    { pt := Y, π := (const J).map f ≫ h.hom.app (op X) { down := 𝟙 X } }
tactic: dsimp [coneOfHom, limitCone, Cone.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 : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
⊢ { pt := Y, π := h.hom.app (op Y) { down := f } } =
    { pt := Y, π := (const J).map f ≫ h.hom.app (op X) { down := 𝟙 X } }
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 : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
⊢ (h.hom.app (op Y) { down := f }).app j = ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).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 : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
⊢ (h.hom.app (op Y) { down := f }).app j = ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).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✝ : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
t :
  ((yoneda.obj X ⋙ uliftFunctor.{u₁, v₃}).map f.op ≫ h.hom.app (op Y)) { down := 𝟙 X } =
    (h.hom.app (op X) ≫ F.cones.map f.op) { down := 𝟙 X }
⊢ (h.hom.app (op Y) { down := f }).app j = ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).app j
tactic: have t := congrFun (h.hom.naturality f.op) ⟨𝟙 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✝ : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
t :
  ((yoneda.obj X ⋙ uliftFunctor.{u₁, v₃}).map f.op ≫ h.hom.app (op Y)) { down := 𝟙 X } =
    (h.hom.app (op X) ≫ F.cones.map f.op) { down := 𝟙 X }
⊢ (h.hom.app (op Y) { down := f }).app j = ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).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✝ : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
t : h.hom.app (op Y) { down := f ≫ 𝟙 X } = F.cones.map f.op (h.hom.app (op X) { down := 𝟙 X })
⊢ (h.hom.app (op Y) { down := f }).app j = ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).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✝ : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
t : h.hom.app (op Y) { down := f ≫ 𝟙 X } = F.cones.map f.op (h.hom.app (op X) { down := 𝟙 X })
⊢ (h.hom.app (op Y) { down := f }).app j = ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).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✝ : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
t : h.hom.app (op Y) { down := f } = F.cones.map f.op (h.hom.app (op X) { down := 𝟙 X })
⊢ (h.hom.app (op Y) { down := f }).app j = ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).app j
tactic: simp only [comp_id] 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✝ : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
t : h.hom.app (op Y) { down := f } = F.cones.map f.op (h.hom.app (op X) { down := 𝟙 X })
⊢ (h.hom.app (op Y) { down := f }).app j = ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).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✝ : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
t : h.hom.app (op Y) { down := f } = F.cones.map f.op (h.hom.app (op X) { down := 𝟙 X })
⊢ (F.cones.map f.op (h.hom.app (op X) { down := 𝟙 X })).app j =
    ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).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✝ : Cone F
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
j : J
t : h.hom.app (op Y) { down := f } = F.cones.map f.op (h.hom.app (op X) { down := 𝟙 X })
⊢ (F.cones.map f.op (h.hom.app (op X) { down := 𝟙 X })).app j =
    ((const J).map f ≫ h.hom.app (op X) { down := 𝟙 X }).app j
state_after: no goals
tactic: rfl