-- Mathlib/CategoryTheory/Limits/IsLimit.lean
theorem coneOfHom_fac {Y : C} (f : Y ⟶ X) : coneOfHom h f = (limitCone h).extend f

Proof state:
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
X : C
h : yoneda.obj X ⋙ uliftFunctor.{u₁, v₃} ≅ F.cones
Y : C
f : Y ⟶ X
⊢ coneOfHom h f = (limitCone h).extend f

Tactic:
dsimp [coneOfHom, limitCone, Cone.extend]

Result:
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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 } }

Proof state:
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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:
congr with j

Result:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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

Proof state:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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:
rfl

Result:
no goals

Proof state:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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:
rw [congrFun (congrArg NatTrans.app t) j]

Result:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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

Proof state:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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:
simp only [comp_id] at t

Result:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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

Proof state:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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:
dsimp at t

Result:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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

Proof state:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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:
have t := congrFun (h.hom.naturality f.op) ⟨𝟙 X⟩

Result:
case e_π.w.h
J : Type u₁
inst✝¹ : Category.{v₁, u₁} J
C : Type u₃
inst✝ : Category.{v₃, u₃} C
F : J ⥤ C
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