Theorem: CategoryTheory.Functor.IsCoverDense.Types.pushforwardFamily_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.45377, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.45429, 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 : D
x : ℱ.obj (op X)
Y : C
f : G.obj Y ⟶ X
⊢ pushforwardFamily α x f ⋯ = α.app (op Y) (ℱ.map f.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.45377, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.45429, 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 : D
x : ℱ.obj (op X)
Y : C
f : G.obj Y ⟶ X
⊢ ℱ'.val.map (Nonempty.some ⋯).lift.op (α.app (op (Nonempty.some ⋯).1) (ℱ.map (Nonempty.some ⋯).map.op x)) =
    α.app (op Y) (ℱ.map f.op x)
tactic: simp only [pushforwardFamily_def, op_obj]
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.45377, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.45429, 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 : D
x : ℱ.obj (op X)
Y : C
f : G.obj Y ⟶ X
⊢ ℱ'.val.map (Nonempty.some ⋯).lift.op (α.app (op (Nonempty.some ⋯).1) (ℱ.map (Nonempty.some ⋯).map.op x)) =
    α.app (op Y) (ℱ.map f.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.45377, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.45429, 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 : D
x : ℱ.obj (op X)
Y : C
f : G.obj Y ⟶ X
l : CoverByImageStructure G f
⊢ ℱ'.val.map l.lift.op (α.app (op l.1) (ℱ.map l.map.op x)) = α.app (op Y) (ℱ.map f.op x)
tactic: generalize Nonempty.some (Presieve.in_coverByImage G f) = l
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.45377, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.45429, 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 : D
x : ℱ.obj (op X)
Y : C
f : G.obj Y ⟶ X
l : CoverByImageStructure G f
⊢ ℱ'.val.map l.lift.op (α.app (op l.1) (ℱ.map l.map.op x)) = α.app (op Y) (ℱ.map f.op x)
state_after: case mk
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.45377, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.45429, 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 : D
x : ℱ.obj (op X)
Y W : C
iYW : G.obj Y ⟶ G.obj W
iWX : G.obj W ⟶ X
⊢ ℱ'.val.map { obj := W, lift := iYW, map := iWX, fac := ⋯ }.lift.op
      (α.app (op { obj := W, lift := iYW, map := iWX, fac := ⋯ }.1)
        (ℱ.map { obj := W, lift := iYW, map := iWX, fac := ⋯ }.map.op x)) =
    α.app (op Y) (ℱ.map (iYW ≫ iWX).op x)
tactic: obtain ⟨W, iYW, iWX, rfl⟩ := l
state_before: case mk
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.45377, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.45429, 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 : D
x : ℱ.obj (op X)
Y W : C
iYW : G.obj Y ⟶ G.obj W
iWX : G.obj W ⟶ X
⊢ ℱ'.val.map { obj := W, lift := iYW, map := iWX, fac := ⋯ }.lift.op
      (α.app (op { obj := W, lift := iYW, map := iWX, fac := ⋯ }.1)
        (ℱ.map { obj := W, lift := iYW, map := iWX, fac := ⋯ }.map.op x)) =
    α.app (op Y) (ℱ.map (iYW ≫ iWX).op x)
state_after: no goals
tactic: simp only [← op_comp, ← FunctorToTypes.map_comp_apply, naturality_apply]