Theorem: CategoryTheory.Sheaf.preservesSheafification_of_adjunction
File: Mathlib/CategoryTheory/Sites/Adjunction.lean

tactic: have := adj.isRightAdjoint
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
⊢ J.W.inverseImage ((whiskeringRight Cᵒᵖ E D).obj G) f
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
⊢ J.W.inverseImage ((whiskeringRight Cᵒᵖ E D).obj G) f

tactic: rw [MorphismProperty.inverseImage_iff]
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
⊢ J.W.inverseImage ((whiskeringRight Cᵒᵖ E D).obj G) f
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
⊢ J.W (((whiskeringRight Cᵒᵖ E D).obj G).map f)

tactic: dsimp
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
⊢ J.W (((whiskeringRight Cᵒᵖ E D).obj G).map f)
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
⊢ J.W (whiskerRight f G)

tactic: intro R hR
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
⊢ J.W (whiskerRight f G)
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
⊢ Function.Bijective fun g => whiskerRight f G ≫ g

tactic: rw [← ((adj.whiskerRight Cᵒᵖ).homEquiv P R).comp_bijective]
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
⊢ Function.Bijective fun g => whiskerRight f G ≫ g
state_after: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
⊢ Function.Bijective (⇑((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv P R) ∘ fun g => whiskerRight f G ≫ g)

tactic: convert (((adj.whiskerRight Cᵒᵖ).homEquiv Q R).trans
  (hf.homEquiv (R ⋙ F) ((sheafCompose J F).obj ⟨R, hR⟩).cond)).bijective
state_before: C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
⊢ Function.Bijective (⇑((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv P R) ∘ fun g => whiskerRight f G ≫ g)
state_after: case h.e'_3.h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
e_1✝ : (Q ⋙ G ⟶ R) = (((whiskeringRight Cᵒᵖ E D).obj G).obj Q ⟶ R)
e_2✝ : (P ⟶ ((whiskeringRight Cᵒᵖ D E).obj F).obj R) = (P ⟶ R ⋙ F)
⊢ (⇑((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv P R) ∘ fun g => whiskerRight f G ≫ g) =
    ⇑(((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv Q R).trans (Localization.LeftBousfield.W.homEquiv hf (R ⋙ F) ⋯))

tactic: ext g X
state_before: case h.e'_3.h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
e_1✝ : (Q ⋙ G ⟶ R) = (((whiskeringRight Cᵒᵖ E D).obj G).obj Q ⟶ R)
e_2✝ : (P ⟶ ((whiskeringRight Cᵒᵖ D E).obj F).obj R) = (P ⟶ R ⋙ F)
⊢ (⇑((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv P R) ∘ fun g => whiskerRight f G ≫ g) =
    ⇑(((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv Q R).trans (Localization.LeftBousfield.W.homEquiv hf (R ⋙ F) ⋯))
state_after: case h.e'_3.h.h.w.h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
e_1✝ : (Q ⋙ G ⟶ R) = (((whiskeringRight Cᵒᵖ E D).obj G).obj Q ⟶ R)
e_2✝ : (P ⟶ ((whiskeringRight Cᵒᵖ D E).obj F).obj R) = (P ⟶ R ⋙ F)
g : Q ⋙ G ⟶ R
X : Cᵒᵖ
⊢ ((⇑((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv P R) ∘ fun g => whiskerRight f G ≫ g) g).app X =
    ((((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv Q R).trans (Localization.LeftBousfield.W.homEquiv hf (R ⋙ F) ⋯))
          g).app
      X

tactic: dsimp [Adjunction.whiskerRight, Adjunction.mkOfUnitCounit]
state_before: case h.e'_3.h.h.w.h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
e_1✝ : (Q ⋙ G ⟶ R) = (((whiskeringRight Cᵒᵖ E D).obj G).obj Q ⟶ R)
e_2✝ : (P ⟶ ((whiskeringRight Cᵒᵖ D E).obj F).obj R) = (P ⟶ R ⋙ F)
g : Q ⋙ G ⟶ R
X : Cᵒᵖ
⊢ ((⇑((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv P R) ∘ fun g => whiskerRight f G ≫ g) g).app X =
    ((((Adjunction.whiskerRight Cᵒᵖ adj).homEquiv Q R).trans (Localization.LeftBousfield.W.homEquiv hf (R ⋙ F) ⋯))
          g).app
      X
state_after: case h.e'_3.h.h.w.h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
e_1✝ : (Q ⋙ G ⟶ R) = (((whiskeringRight Cᵒᵖ E D).obj G).obj Q ⟶ R)
e_2✝ : (P ⟶ ((whiskeringRight Cᵒᵖ D E).obj F).obj R) = (P ⟶ R ⋙ F)
g : Q ⋙ G ⟶ R
X : Cᵒᵖ
⊢ (𝟙 (P.obj X) ≫ adj.unit.app (P.obj X) ≫ 𝟙 (F.obj (G.obj (P.obj X)))) ≫ F.map (G.map (f.app X) ≫ g.app X) =
    f.app X ≫ (𝟙 (Q.obj X) ≫ adj.unit.app (Q.obj X) ≫ 𝟙 (F.obj (G.obj (Q.obj X)))) ≫ F.map (g.app X)

tactic: simp
state_before: case h.e'_3.h.h.w.h
C : Type u₁
inst✝³ : Category.{v₁, u₁} C
J : GrothendieckTopology C
D : Type u₂
inst✝² : Category.{v₂, u₂} D
E : Type u_1
inst✝¹ : Category.{u_2, u_1} E
F : D ⥤ E
G : E ⥤ D
inst✝ : HasWeakSheafify J D
adj : G ⊣ F
P Q : Cᵒᵖ ⥤ E
f : P ⟶ Q
hf : J.W f
this : F.IsRightAdjoint
R : Cᵒᵖ ⥤ D
hR : Presheaf.IsSheaf J R
e_1✝ : (Q ⋙ G ⟶ R) = (((whiskeringRight Cᵒᵖ E D).obj G).obj Q ⟶ R)
e_2✝ : (P ⟶ ((whiskeringRight Cᵒᵖ D E).obj F).obj R) = (P ⟶ R ⋙ F)
g : Q ⋙ G ⟶ R
X : Cᵒᵖ
⊢ (𝟙 (P.obj X) ≫ adj.unit.app (P.obj X) ≫ 𝟙 (F.obj (G.obj (P.obj X)))) ≫ F.map (G.map (f.app X) ≫ g.app X) =
    f.app X ≫ (𝟙 (Q.obj X) ≫ adj.unit.app (Q.obj X) ≫ 𝟙 (F.obj (G.obj (Q.obj X)))) ≫ F.map (g.app X)
state_after: no goals