Theorem: CategoryTheory.Functor.IsCoverDense.Types.presheafHom_app
File: Mathlib/CategoryTheory/Sites/DenseSubsite.lean

Proof steps:
state_before: C : Type u_1
inst✝⁵ : Category.{?u.57581, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.57588, u_2} D
E : Type u_3
inst✝³ : Category.{?u.57595, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.57647, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α✝ α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Dᵒᵖ
f : X ⟶ Y
⊢ ℱ.map f ≫ (fun X => appHom α (unop X)) Y = (fun X => appHom α (unop X)) X ≫ ℱ'.val.map f
state_after: case h
C : Type u_1
inst✝⁵ : Category.{?u.57581, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.57588, u_2} D
E : Type u_3
inst✝³ : Category.{?u.57595, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.57647, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α✝ α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Dᵒᵖ
f : X ⟶ Y
x : ℱ.obj X
⊢ (ℱ.map f ≫ (fun X => appHom α (unop X)) Y) x = ((fun X => appHom α (unop X)) X ≫ ℱ'.val.map f) x
tactic: ext x
state_before: case h
C : Type u_1
inst✝⁵ : Category.{?u.57581, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.57588, u_2} D
E : Type u_3
inst✝³ : Category.{?u.57595, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.57647, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α✝ α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Dᵒᵖ
f : X ⟶ Y
x : ℱ.obj X
⊢ (ℱ.map f ≫ (fun X => appHom α (unop X)) Y) x = ((fun X => appHom α (unop X)) X ≫ ℱ'.val.map f) x
state_after: case h.h
C : Type u_1
inst✝⁵ : Category.{?u.57581, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.57588, u_2} D
E : Type u_3
inst✝³ : Category.{?u.57595, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.57647, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α✝ α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Dᵒᵖ
f : X ⟶ Y
x : ℱ.obj X
⊢ ∀ ⦃Y_1 : C⦄ (f_1 : G.obj Y_1 ⟶ unop Y),
    ℱ'.val.map f_1.op ((ℱ.map f ≫ (fun X => appHom α (unop X)) Y) x) =
      ℱ'.val.map f_1.op (((fun X => appHom α (unop X)) X ≫ ℱ'.val.map f) x)
tactic: apply Functor.IsCoverDense.ext G
state_before: case h.h
C : Type u_1
inst✝⁵ : Category.{?u.57581, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.57588, u_2} D
E : Type u_3
inst✝³ : Category.{?u.57595, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.57647, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α✝ α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Dᵒᵖ
f : X ⟶ Y
x : ℱ.obj X
⊢ ∀ ⦃Y_1 : C⦄ (f_1 : G.obj Y_1 ⟶ unop Y),
    ℱ'.val.map f_1.op ((ℱ.map f ≫ (fun X => appHom α (unop X)) Y) x) =
      ℱ'.val.map f_1.op (((fun X => appHom α (unop X)) X ≫ ℱ'.val.map f) x)
state_after: case h.h
C : Type u_1
inst✝⁵ : Category.{?u.57581, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.57588, u_2} D
E : Type u_3
inst✝³ : Category.{?u.57595, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.57647, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α✝ α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Dᵒᵖ
f : X ⟶ Y
x : ℱ.obj X
Y' : C
f' : G.obj Y' ⟶ unop Y
⊢ ℱ'.val.map f'.op ((ℱ.map f ≫ (fun X => appHom α (unop X)) Y) x) =
    ℱ'.val.map f'.op (((fun X => appHom α (unop X)) X ≫ ℱ'.val.map f) x)
tactic: intro Y' f'
state_before: case h.h
C : Type u_1
inst✝⁵ : Category.{?u.57581, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.57588, u_2} D
E : Type u_3
inst✝³ : Category.{?u.57595, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.57647, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α✝ α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Dᵒᵖ
f : X ⟶ Y
x : ℱ.obj X
Y' : C
f' : G.obj Y' ⟶ unop Y
⊢ ℱ'.val.map f'.op ((ℱ.map f ≫ (fun X => appHom α (unop X)) Y) x) =
    ℱ'.val.map f'.op (((fun X => appHom α (unop X)) X ≫ ℱ'.val.map f) x)
state_after: no goals
tactic: simp only [appHom_restrict, types_comp_apply, ← FunctorToTypes.map_comp_apply]