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

Proof steps:
state_before: C : Type u_1
inst✝⁵ : Category.{u_6, u_1} C
D : Type u_2
inst✝⁴ : Category.{u_5, u_2} D
E : Type u_3
inst✝³ : Category.{?u.25079, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.25131, 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 : C
i : G.obj X ⟶ G.obj Y
x : (G.op ⋙ ℱ).obj (op Y)
⊢ ℱ'.val.map i.op (α.app (op Y) x) = α.app (op X) (ℱ.map i.op x)
state_after: C : Type u_1
inst✝⁵ : Category.{u_6, u_1} C
D : Type u_2
inst✝⁴ : Category.{u_5, u_2} D
E : Type u_3
inst✝³ : Category.{?u.25079, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.25131, 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 : C
i : G.obj X ⟶ G.obj Y
x : (G.op ⋙ ℱ).obj (op Y)
this :
  ∀ {X Y : C} (i : X ⟶ Y) (x : (G.op ⋙ ℱ).obj (op Y)),
    ℱ'.val.map (G.map i).op (α.app (op Y) x) = α.app (op X) (ℱ.map (G.map i).op x)
⊢ ℱ'.val.map i.op (α.app (op Y) x) = α.app (op X) (ℱ.map i.op x)
tactic: have {X Y} (i : X ⟶ Y) (x) :
      ℱ'.1.map (G.map i).op (α.app _ x) = α.app _ (ℱ.map (G.map i).op x) := by
    exact congr_fun (α.naturality i.op).symm x
state_before: C : Type u_1
inst✝⁵ : Category.{u_6, u_1} C
D : Type u_2
inst✝⁴ : Category.{u_5, u_2} D
E : Type u_3
inst✝³ : Category.{?u.25079, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.25131, 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 : C
i : G.obj X ⟶ G.obj Y
x : (G.op ⋙ ℱ).obj (op Y)
this :
  ∀ {X Y : C} (i : X ⟶ Y) (x : (G.op ⋙ ℱ).obj (op Y)),
    ℱ'.val.map (G.map i).op (α.app (op Y) x) = α.app (op X) (ℱ.map (G.map i).op x)
⊢ ℱ'.val.map i.op (α.app (op Y) x) = α.app (op X) (ℱ.map i.op x)
state_after: C : Type u_1
inst✝⁵ : Category.{u_6, u_1} C
D : Type u_2
inst✝⁴ : Category.{u_5, u_2} D
E : Type u_3
inst✝³ : Category.{?u.25079, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.25131, 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 : C
i : G.obj X ⟶ G.obj Y
x : (G.op ⋙ ℱ).obj (op Y)
this :
  ∀ {X Y : C} (i : X ⟶ Y) (x : (G.op ⋙ ℱ).obj (op Y)),
    ℱ'.val.map (G.map i).op (α.app (op Y) x) = α.app (op X) (ℱ.map (G.map i).op x)
V : C
iVX : V ⟶ X
iVY : V ⟶ Y
e : G.map iVY = G.map iVX ≫ i
⊢ ℱ'.val.map (G.map iVX).op (ℱ'.val.map i.op (α.app (op Y) x)) = ℱ'.val.map (G.map iVX).op (α.app (op X) (ℱ.map i.op x))
tactic: refine IsLocallyFull.ext G _ i fun V iVX iVY e ↦ ?_
state_before: C : Type u_1
inst✝⁵ : Category.{u_6, u_1} C
D : Type u_2
inst✝⁴ : Category.{u_5, u_2} D
E : Type u_3
inst✝³ : Category.{?u.25079, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.25131, 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 : C
i : G.obj X ⟶ G.obj Y
x : (G.op ⋙ ℱ).obj (op Y)
this :
  ∀ {X Y : C} (i : X ⟶ Y) (x : (G.op ⋙ ℱ).obj (op Y)),
    ℱ'.val.map (G.map i).op (α.app (op Y) x) = α.app (op X) (ℱ.map (G.map i).op x)
V : C
iVX : V ⟶ X
iVY : V ⟶ Y
e : G.map iVY = G.map iVX ≫ i
⊢ ℱ'.val.map (G.map iVX).op (ℱ'.val.map i.op (α.app (op Y) x)) = ℱ'.val.map (G.map iVX).op (α.app (op X) (ℱ.map i.op x))
state_after: no goals
tactic: simp only [comp_obj, types_comp_apply, ← FunctorToTypes.map_comp_apply, ← op_comp, ← e, this]