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

tactic: unfold pushforwardFamily
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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ pushforwardFamily α x f ⋯ = α.app { unop := 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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ ℱ'.val.map (Nonempty.some ⋯).lift.op (α.app { unop := (Nonempty.some ⋯).1 } (ℱ.map (Nonempty.some ⋯).map.op x)) =
    α.app { unop := Y } (ℱ.map f.op x)

tactic: refine congr_fun (?_ :
  (fun t => ℱ'.val.map ((Nonempty.some (_ : coverByImage G X f)).lift.op)
    (α.app (op (Nonempty.some (_ : coverByImage G X f)).1)
      (ℱ.map ((Nonempty.some (_ : coverByImage G X f)).map.op) t))) =
  (fun t => α.app (op Y) (ℱ.map (f.op) t))) 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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ ℱ'.val.map (Nonempty.some ⋯).lift.op (α.app { unop := (Nonempty.some ⋯).1 } (ℱ.map (Nonempty.some ⋯).map.op x)) =
    α.app { unop := 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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ (fun t =>
      ℱ'.val.map (Nonempty.some ⋯).lift.op
        (α.app { unop := (Nonempty.some ⋯).obj } (ℱ.map (Nonempty.some ⋯).map.op t))) =
    fun t => α.app { unop := Y } (ℱ.map f.op t)

tactic: rw [← G.map_preimage (Nonempty.some _ : Presieve.CoverByImageStructure _ _).lift]
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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ (fun t =>
      ℱ'.val.map (Nonempty.some ⋯).lift.op
        (α.app { unop := (Nonempty.some ⋯).obj } (ℱ.map (Nonempty.some ⋯).map.op t))) =
    fun t => α.app { unop := Y } (ℱ.map f.op t)
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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ (fun t =>
      ℱ'.val.map (G.map (G.preimage (Nonempty.some ⋯).lift)).op
        (α.app { unop := (Nonempty.some ⋯).obj } (ℱ.map (Nonempty.some ⋯).map.op t))) =
    fun t => α.app { unop := Y } (ℱ.map f.op t)

tactic: change ℱ.map _ ≫ α.app (op _) ≫ ℱ'.val.map _ = ℱ.map f.op ≫ α.app (op Y)
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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ (fun t =>
      ℱ'.val.map (G.map (G.preimage (Nonempty.some ⋯).lift)).op
        (α.app { unop := (Nonempty.some ⋯).obj } (ℱ.map (Nonempty.some ⋯).map.op t))) =
    fun t => α.app { unop := Y } (ℱ.map f.op t)
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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ ℱ.map (Nonempty.some ⋯).map.op ≫
      α.app { unop := (Nonempty.some ⋯).1 } ≫ ℱ'.val.map (G.map (G.preimage (Nonempty.some ⋯).lift)).op =
    ℱ.map f.op ≫ α.app { unop := Y }

tactic: erw [← α.naturality (G.preimage _).op]
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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ ℱ.map (Nonempty.some ⋯).map.op ≫
      α.app { unop := (Nonempty.some ⋯).1 } ≫ ℱ'.val.map (G.map (G.preimage (Nonempty.some ⋯).lift)).op =
    ℱ.map f.op ≫ α.app { unop := Y }
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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ ℱ.map (Nonempty.some ⋯).map.op ≫ (G.op ⋙ ℱ).map (G.preimage (Nonempty.some ⋯).lift).op ≫ α.app { unop := Y } =
    ℱ.map f.op ≫ α.app { unop := Y }

tactic: simp only [← Functor.map_comp, ← Category.assoc, Functor.comp_map, G.map_preimage, G.op_map,
  Quiver.Hom.unop_op, ← op_comp, Presieve.CoverByImageStructure.fac]
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.36644, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.36696, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.Full
ℱ : Dᵒᵖ ⥤ Type v
ℱ' : SheafOfTypes K
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X : D
x : ℱ.obj { unop := X }
Y : C
f : G.obj Y ⟶ X
⊢ ℱ.map (Nonempty.some ⋯).map.op ≫ (G.op ⋙ ℱ).map (G.preimage (Nonempty.some ⋯).lift).op ≫ α.app { unop := Y } =
    ℱ.map f.op ≫ α.app { unop := Y }
state_after: no goals