Theorem: CategoryTheory.Functor.FullyFaithful.whiskeringRight_preimage_app
File: Mathlib/CategoryTheory/Whiskering.lean

Proof steps:
state_before: C✝ : Type u₁
inst✝³ : Category.{v₁, u₁} C✝
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u₃
inst✝¹ : Category.{v₃, u₃} E
F : D ⥤ E
hF : F.FullyFaithful
C : Type u_1
inst✝ : Category.{?u.29894, u_1} C
X✝ Y✝ : C ⥤ D
f : ((CategoryTheory.whiskeringRight C D E).obj F).obj X✝ ⟶ ((CategoryTheory.whiskeringRight C D E).obj F).obj Y✝
x✝¹ x✝ : C
g : x✝¹ ⟶ x✝
⊢ X✝.map g ≫ (fun X => hF.preimage (f.app X)) x✝ = (fun X => hF.preimage (f.app X)) x✝¹ ≫ Y✝.map g
state_after: C✝ : Type u₁
inst✝³ : Category.{v₁, u₁} C✝
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u₃
inst✝¹ : Category.{v₃, u₃} E
F : D ⥤ E
hF : F.FullyFaithful
C : Type u_1
inst✝ : Category.{?u.29894, u_1} C
X✝ Y✝ : C ⥤ D
f : ((CategoryTheory.whiskeringRight C D E).obj F).obj X✝ ⟶ ((CategoryTheory.whiskeringRight C D E).obj F).obj Y✝
x✝¹ x✝ : C
g : x✝¹ ⟶ x✝
⊢ F.map (X✝.map g ≫ (fun X => hF.preimage (f.app X)) x✝) = F.map ((fun X => hF.preimage (f.app X)) x✝¹ ≫ Y✝.map g)
tactic: apply hF.map_injective
state_before: C✝ : Type u₁
inst✝³ : Category.{v₁, u₁} C✝
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u₃
inst✝¹ : Category.{v₃, u₃} E
F : D ⥤ E
hF : F.FullyFaithful
C : Type u_1
inst✝ : Category.{?u.29894, u_1} C
X✝ Y✝ : C ⥤ D
f : ((CategoryTheory.whiskeringRight C D E).obj F).obj X✝ ⟶ ((CategoryTheory.whiskeringRight C D E).obj F).obj Y✝
x✝¹ x✝ : C
g : x✝¹ ⟶ x✝
⊢ F.map (X✝.map g ≫ (fun X => hF.preimage (f.app X)) x✝) = F.map ((fun X => hF.preimage (f.app X)) x✝¹ ≫ Y✝.map g)
state_after: C✝ : Type u₁
inst✝³ : Category.{v₁, u₁} C✝
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u₃
inst✝¹ : Category.{v₃, u₃} E
F : D ⥤ E
hF : F.FullyFaithful
C : Type u_1
inst✝ : Category.{?u.29894, u_1} C
X✝ Y✝ : C ⥤ D
f : ((CategoryTheory.whiskeringRight C D E).obj F).obj X✝ ⟶ ((CategoryTheory.whiskeringRight C D E).obj F).obj Y✝
x✝¹ x✝ : C
g : x✝¹ ⟶ x✝
⊢ F.map (X✝.map g ≫ hF.preimage (f.app x✝)) = F.map (hF.preimage (f.app x✝¹) ≫ Y✝.map g)
tactic: dsimp
state_before: C✝ : Type u₁
inst✝³ : Category.{v₁, u₁} C✝
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u₃
inst✝¹ : Category.{v₃, u₃} E
F : D ⥤ E
hF : F.FullyFaithful
C : Type u_1
inst✝ : Category.{?u.29894, u_1} C
X✝ Y✝ : C ⥤ D
f : ((CategoryTheory.whiskeringRight C D E).obj F).obj X✝ ⟶ ((CategoryTheory.whiskeringRight C D E).obj F).obj Y✝
x✝¹ x✝ : C
g : x✝¹ ⟶ x✝
⊢ F.map (X✝.map g ≫ hF.preimage (f.app x✝)) = F.map (hF.preimage (f.app x✝¹) ≫ Y✝.map g)
state_after: C✝ : Type u₁
inst✝³ : Category.{v₁, u₁} C✝
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u₃
inst✝¹ : Category.{v₃, u₃} E
F : D ⥤ E
hF : F.FullyFaithful
C : Type u_1
inst✝ : Category.{?u.29894, u_1} C
X✝ Y✝ : C ⥤ D
f : ((CategoryTheory.whiskeringRight C D E).obj F).obj X✝ ⟶ ((CategoryTheory.whiskeringRight C D E).obj F).obj Y✝
x✝¹ x✝ : C
g : x✝¹ ⟶ x✝
⊢ F.map (X✝.map g) ≫ f.app x✝ = f.app x✝¹ ≫ F.map (Y✝.map g)
tactic: simp only [map_comp, map_preimage]
state_before: C✝ : Type u₁
inst✝³ : Category.{v₁, u₁} C✝
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u₃
inst✝¹ : Category.{v₃, u₃} E
F : D ⥤ E
hF : F.FullyFaithful
C : Type u_1
inst✝ : Category.{?u.29894, u_1} C
X✝ Y✝ : C ⥤ D
f : ((CategoryTheory.whiskeringRight C D E).obj F).obj X✝ ⟶ ((CategoryTheory.whiskeringRight C D E).obj F).obj Y✝
x✝¹ x✝ : C
g : x✝¹ ⟶ x✝
⊢ F.map (X✝.map g) ≫ f.app x✝ = f.app x✝¹ ≫ F.map (Y✝.map g)
state_after: no goals
tactic: apply f.naturality