Theorem: CategoryTheory.Limits.coneOfConeUncurry_π_app
File: Mathlib/CategoryTheory/Limits/Fubini.lean

Proof steps:
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
⊢ ((Functor.const K).obj c.pt).map f ≫ (fun k => c.π.app (j, k)) k' = (fun k => c.π.app (j, k)) k ≫ (F.obj j).map f
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
⊢ 𝟙 c.pt ≫ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
tactic: dsimp
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
⊢ 𝟙 c.pt ≫ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
⊢ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
tactic: simp only [Category.id_comp]
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
⊢ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
this : ((Functor.const (J × K)).obj c.pt).map (𝟙 j, f) ≫ c.π.app (j, k') = c.π.app (j, k) ≫ (uncurry.obj F).map (𝟙 j, f)
⊢ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
tactic: have := @NatTrans.naturality _ _ _ _ _ _ c.π (j, k) (j, k') (𝟙 j, f)
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
this : ((Functor.const (J × K)).obj c.pt).map (𝟙 j, f) ≫ c.π.app (j, k') = c.π.app (j, k) ≫ (uncurry.obj F).map (𝟙 j, f)
⊢ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
this : 𝟙 c.pt ≫ c.π.app (j, k') = c.π.app (j, k) ≫ (F.map (𝟙 j)).app k ≫ (F.obj j).map f
⊢ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
tactic: dsimp at this
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
this : 𝟙 c.pt ≫ c.π.app (j, k') = c.π.app (j, k) ≫ (F.map (𝟙 j)).app k ≫ (F.obj j).map f
⊢ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
this : c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
⊢ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
tactic: simp? at this says
                    simp only [Category.id_comp, Functor.map_id, NatTrans.id_app] at this
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j : J
k k' : K
f : k ⟶ k'
this : c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
⊢ c.π.app (j, k') = c.π.app (j, k) ≫ (F.obj j).map f
state_after: no goals
tactic: exact this
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
⊢ ∀ (j_1 : K),
    (((Functor.const J).obj c.pt).map f ≫
          (fun j => (Q j).lift { pt := c.pt, π := { app := fun k => c.π.app (j, k), naturality := ⋯ } }) j') ≫
        (D.obj j').π.app j_1 =
      ((fun j => (Q j).lift { pt := c.pt, π := { app := fun k => c.π.app (j, k), naturality := ⋯ } }) j ≫
          D.conePoints.map f) ≫
        (D.obj j').π.app j_1
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
⊢ ∀ (j_1 : K),
    (𝟙 c.pt ≫ (Q j').lift { pt := c.pt, π := { app := fun k => c.π.app (j', k), naturality := ⋯ } }) ≫
        (D.obj j').π.app j_1 =
      ((Q j).lift { pt := c.pt, π := { app := fun k => c.π.app (j, k), naturality := ⋯ } } ≫ (D.map f).hom) ≫
        (D.obj j').π.app j_1
tactic: dsimp
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
⊢ ∀ (j_1 : K),
    (𝟙 c.pt ≫ (Q j').lift { pt := c.pt, π := { app := fun k => c.π.app (j', k), naturality := ⋯ } }) ≫
        (D.obj j').π.app j_1 =
      ((Q j).lift { pt := c.pt, π := { app := fun k => c.π.app (j, k), naturality := ⋯ } } ≫ (D.map f).hom) ≫
        (D.obj j').π.app j_1
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
⊢ (𝟙 c.pt ≫ (Q j').lift { pt := c.pt, π := { app := fun k => c.π.app (j', k), naturality := ⋯ } }) ≫
      (D.obj j').π.app k =
    ((Q j).lift { pt := c.pt, π := { app := fun k => c.π.app (j, k), naturality := ⋯ } } ≫ (D.map f).hom) ≫
      (D.obj j').π.app k
tactic: intro k
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
⊢ (𝟙 c.pt ≫ (Q j').lift { pt := c.pt, π := { app := fun k => c.π.app (j', k), naturality := ⋯ } }) ≫
      (D.obj j').π.app k =
    ((Q j).lift { pt := c.pt, π := { app := fun k => c.π.app (j, k), naturality := ⋯ } } ≫ (D.map f).hom) ≫
      (D.obj j').π.app k
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
⊢ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
tactic: simp only [Limits.ConeMorphism.w, Limits.Cones.postcompose_obj_π,
              Limits.IsLimit.fac_assoc, Limits.IsLimit.fac, NatTrans.comp_app, Category.id_comp,
              Category.assoc]
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
⊢ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
this : ((Functor.const (J × K)).obj c.pt).map (f, 𝟙 k) ≫ c.π.app (j', k) = c.π.app (j, k) ≫ (uncurry.obj F).map (f, 𝟙 k)
⊢ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
tactic: have := @NatTrans.naturality _ _ _ _ _ _ c.π (j, k) (j', k) (f, 𝟙 k)
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
this : ((Functor.const (J × K)).obj c.pt).map (f, 𝟙 k) ≫ c.π.app (j', k) = c.π.app (j, k) ≫ (uncurry.obj F).map (f, 𝟙 k)
⊢ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
this : 𝟙 c.pt ≫ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k ≫ (F.obj j').map (𝟙 k)
⊢ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
tactic: dsimp at this
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
this : 𝟙 c.pt ≫ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k ≫ (F.obj j').map (𝟙 k)
⊢ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
state_after: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
this : c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
⊢ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
tactic: simp only [Category.id_comp, Category.comp_id, CategoryTheory.Functor.map_id,
              NatTrans.id_app] at this
state_before: J K : Type v
inst✝² : SmallCategory J
inst✝¹ : SmallCategory K
C : Type u
inst✝ : Category.{v, u} C
F : J ⥤ K ⥤ C
D : DiagramOfCones F
Q : (j : J) → IsLimit (D.obj j)
c : Cone (uncurry.obj F)
j j' : J
f : j ⟶ j'
k : K
this : c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
⊢ c.π.app (j', k) = c.π.app (j, k) ≫ (F.map f).app k
state_after: no goals
tactic: exact this