Theorem: CategoryTheory.Equivalence.hasSheafCompose
File: Mathlib/CategoryTheory/Sites/Equivalence.lean

tactic: have hP' : Presheaf.IsSheaf K (e.inverse.op ⋙ P ⋙ F) := by
  change Presheaf.IsSheaf K ((_ ⋙ _) ⋙ _)
  apply HasSheafCompose.isSheaf
  exact e.inverse.op_comp_isSheaf K J ⟨P, hP⟩
state_before: C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
⊢ Presheaf.IsSheaf J (P ⋙ F)
state_after: C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
hP' : Presheaf.IsSheaf K (e.inverse.op ⋙ P ⋙ F)
⊢ Presheaf.IsSheaf J (P ⋙ F)

tactic: replace hP' : Presheaf.IsSheaf J (e.functor.op ⋙ e.inverse.op ⋙ P ⋙ F) :=
  e.functor.op_comp_isSheaf _ _ ⟨_, hP'⟩
state_before: C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
hP' : Presheaf.IsSheaf K (e.inverse.op ⋙ P ⋙ F)
⊢ Presheaf.IsSheaf J (P ⋙ F)
state_after: C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
hP' : Presheaf.IsSheaf J (e.functor.op ⋙ e.inverse.op ⋙ P ⋙ F)
⊢ Presheaf.IsSheaf J (P ⋙ F)

tactic: exact (Presheaf.isSheaf_of_iso_iff ((isoWhiskerRight e.op.unitIso.symm (P ⋙ F)))).mp hP'
state_before: C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
hP' : Presheaf.IsSheaf J (e.functor.op ⋙ e.inverse.op ⋙ P ⋙ F)
⊢ Presheaf.IsSheaf J (P ⋙ F)
state_after: no goals

tactic: change Presheaf.IsSheaf K ((_ ⋙ _) ⋙ _)
state_before: C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
⊢ Presheaf.IsSheaf K (e.inverse.op ⋙ P ⋙ F)
state_after: C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
⊢ Presheaf.IsSheaf K ((e.inverse.op ⋙ P) ⋙ F)

tactic: apply HasSheafCompose.isSheaf
state_before: C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
⊢ Presheaf.IsSheaf K ((e.inverse.op ⋙ P) ⋙ F)
state_after: case hP
C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
⊢ Presheaf.IsSheaf K (e.inverse.op ⋙ P)

tactic: exact e.inverse.op_comp_isSheaf K J ⟨P, hP⟩
state_before: case hP
C : Type u₁
inst✝⁷ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝⁶ : Category.{v₂, u₂} D
K : GrothendieckTopology D
e : C ≌ D
G : D ⥤ C
A✝ : Type u₃
inst✝⁵ : Category.{v₃, u₃} A✝
inst✝⁴ : TransportsGrothendieckTopology J K e
inst✝³ : HasSheafify K A✝
A : Type u_1
inst✝² : Category.{u_3, u_1} A
B : Type u_2
inst✝¹ : Category.{u_4, u_2} B
F : A ⥤ B
inst✝ : K.HasSheafCompose F
P : Cᵒᵖ ⥤ A
hP : Presheaf.IsSheaf J P
⊢ Presheaf.IsSheaf K (e.inverse.op ⋙ P)
state_after: no goals