Theorem: CategoryTheory.NatTrans.prod_app
File: Mathlib/CategoryTheory/Products/Basic.lean

Proof steps:
state_before: A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
X Y : A × C
f : X ⟶ Y
⊢ (F.prod H).map f ≫ (fun X => (α.app X.1, β.app X.2)) Y = (fun X => (α.app X.1, β.app X.2)) X ≫ (G.prod I).map f
state_after: case mk
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
Y : A × C
fst✝ : A
snd✝ : C
f : (fst✝, snd✝) ⟶ Y
⊢ (F.prod H).map f ≫ (fun X => (α.app X.1, β.app X.2)) Y =
    (fun X => (α.app X.1, β.app X.2)) (fst✝, snd✝) ≫ (G.prod I).map f
tactic: cases X
state_before: case mk
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
Y : A × C
fst✝ : A
snd✝ : C
f : (fst✝, snd✝) ⟶ Y
⊢ (F.prod H).map f ≫ (fun X => (α.app X.1, β.app X.2)) Y =
    (fun X => (α.app X.1, β.app X.2)) (fst✝, snd✝) ≫ (G.prod I).map f
state_after: case mk.mk
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ (F.prod H).map f ≫ (fun X => (α.app X.1, β.app X.2)) (fst✝, snd✝) =
    (fun X => (α.app X.1, β.app X.2)) (fst✝¹, snd✝¹) ≫ (G.prod I).map f
tactic: cases Y
state_before: case mk.mk
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ (F.prod H).map f ≫ (fun X => (α.app X.1, β.app X.2)) (fst✝, snd✝) =
    (fun X => (α.app X.1, β.app X.2)) (fst✝¹, snd✝¹) ≫ (G.prod I).map f
state_after: case mk.mk
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ (F.map f.1 ≫ α.app fst✝, H.map f.2 ≫ β.app snd✝) = (α.app fst✝¹ ≫ G.map f.1, β.app snd✝¹ ≫ I.map f.2)
tactic: simp only [Functor.prod_map, prod_comp]
state_before: case mk.mk
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ (F.map f.1 ≫ α.app fst✝, H.map f.2 ≫ β.app snd✝) = (α.app fst✝¹ ≫ G.map f.1, β.app snd✝¹ ≫ I.map f.2)
state_after: case mk.mk
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ F.map f.1 ≫ α.app fst✝ = α.app fst✝¹ ≫ G.map f.1 ∧ H.map f.2 ≫ β.app snd✝ = β.app snd✝¹ ≫ I.map f.2
tactic: rw [Prod.mk.inj_iff]
state_before: case mk.mk
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ F.map f.1 ≫ α.app fst✝ = α.app fst✝¹ ≫ G.map f.1 ∧ H.map f.2 ≫ β.app snd✝ = β.app snd✝¹ ≫ I.map f.2
state_after: case mk.mk.left
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ F.map f.1 ≫ α.app fst✝ = α.app fst✝¹ ≫ G.map f.1

case mk.mk.right
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ H.map f.2 ≫ β.app snd✝ = β.app snd✝¹ ≫ I.map f.2
tactic: constructor
state_before: case mk.mk.left
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ F.map f.1 ≫ α.app fst✝ = α.app fst✝¹ ≫ G.map f.1

case mk.mk.right
A : Type u₁
inst✝³ : Category.{v₁, u₁} A
B : Type u₂
inst✝² : Category.{v₂, u₂} B
C : Type u₃
inst✝¹ : Category.{v₃, u₃} C
D : Type u₄
inst✝ : Category.{v₄, u₄} D
F G : A ⥤ B
H I : C ⥤ D
α : F ⟶ G
β : H ⟶ I
fst✝¹ : A
snd✝¹ : C
fst✝ : A
snd✝ : C
f : (fst✝¹, snd✝¹) ⟶ (fst✝, snd✝)
⊢ H.map f.2 ≫ β.app snd✝ = β.app snd✝¹ ≫ I.map f.2
state_after: no goals
tactic: repeat {rw [naturality]}