-- Mathlib/CategoryTheory/Sites/Adjunction.lean
lemma preservesSheafification_of_adjunction (adj : G ⊣ F) :
    J.PreservesSheafification G where
  le P Q f hf

Proof state:
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
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]

Result:
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
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)

Proof state:
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
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

Result:
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
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) ⋯))

Proof state:
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
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

Result:
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
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