Theorem: CategoryTheory.GrothendieckTopology.W_inverseImage_whiskeringLeft
File: Mathlib/CategoryTheory/Sites/Equivalence.lean

tactic: ext P Q f
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
⊢ K.W.inverseImage ((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op) = J.W
state_after: case h
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
⊢ K.W.inverseImage ((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op) f ↔ J.W f

tactic: have h₂ : ∀ (R : Sheaf J A),
  Function.Bijective (fun (g : G.op ⋙ Q ⟶ G.op ⋙ R.val) ↦ whiskerLeft G.op f ≫ g) ↔
    Function.Bijective (fun (g : Q ⟶ R.val) ↦ f ≫ g) := fun R ↦ by
  rw [← Function.Bijective.of_comp_iff _
    (Functor.whiskerLeft_obj_map_bijective_of_isCoverDense J G Q R.val R.cond)]
  exact Function.Bijective.of_comp_iff'
    (Functor.whiskerLeft_obj_map_bijective_of_isCoverDense J G P R.val R.cond)
      (fun g ↦ f ≫ g)
state_before: case h
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
⊢ K.W.inverseImage ((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op) f ↔ J.W f
state_after: case h
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
⊢ K.W.inverseImage ((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op) f ↔ J.W f

tactic: rw [h₁, J.W_eq_W_range_sheafToPresheaf_obj, MorphismProperty.inverseImage_iff]
state_before: case h
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
⊢ K.W.inverseImage ((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op) f ↔ J.W f
state_after: case h
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
⊢ LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)
      (((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f) ↔
    LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A).obj) f

tactic: constructor
state_before: case h
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
⊢ LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)
      (((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f) ↔
    LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A).obj) f
state_after: case h.mp
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
⊢ LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)
      (((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f) →
    LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A).obj) f

case h.mpr
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
⊢ LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A).obj) f →
    LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)
      (((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f)

tactic: rw [W_eq_W_range_sheafToPresheaf_obj, ← LeftBousfield.W_isoClosure]
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
⊢ K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
⊢ LeftBousfield.W (isoClosure fun x => x ∈ Set.range (sheafToPresheaf K A).obj) =
    LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj

tactic: conv_rhs => rw [← LeftBousfield.W_isoClosure]
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
⊢ LeftBousfield.W (isoClosure fun x => x ∈ Set.range (sheafToPresheaf K A).obj) =
    LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
⊢ LeftBousfield.W (isoClosure fun x => x ∈ Set.range (sheafToPresheaf K A).obj) =
    LeftBousfield.W (isoClosure fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)

tactic: apply congr_arg
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
⊢ LeftBousfield.W (isoClosure fun x => x ∈ Set.range (sheafToPresheaf K A).obj) =
    LeftBousfield.W (isoClosure fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)
state_after: case h
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
⊢ (isoClosure fun x => x ∈ Set.range (sheafToPresheaf K A).obj) =
    isoClosure fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj

tactic: ext P
state_before: case h
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
⊢ (isoClosure fun x => x ∈ Set.range (sheafToPresheaf K A).obj) =
    isoClosure fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
state_after: case h.h.a
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf K A).obj) P ↔
    isoClosure (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj) P

tactic: constructor
state_before: case h.h.a
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf K A).obj) P ↔
    isoClosure (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj) P
state_after: case h.h.a.mp
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf K A).obj) P →
    isoClosure (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj) P

case h.h.a.mpr
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj) P →
    isoClosure (fun x => x ∈ Set.range (sheafToPresheaf K A).obj) P

tactic: rintro ⟨_, ⟨R, rfl⟩, ⟨e⟩⟩
state_before: case h.h.a.mp
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf K A).obj) P →
    isoClosure (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj) P
state_after: case h.h.a.mp.intro.intro.intro.intro
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
R : Sheaf K A
e : P ≅ (sheafToPresheaf K A).obj R
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj) P

tactic: exact ⟨_, ⟨_, rfl⟩, ⟨e.trans ((sheafToPresheaf _ _).mapIso
  ((G.sheafPushforwardContinuous A K J).objObjPreimageIso R).symm)⟩⟩
state_before: case h.h.a.mp.intro.intro.intro.intro
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
R : Sheaf K A
e : P ≅ (sheafToPresheaf K A).obj R
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj) P
state_after: no goals

tactic: rintro ⟨_, ⟨R, rfl⟩, ⟨e⟩⟩
state_before: case h.h.a.mpr
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj) P →
    isoClosure (fun x => x ∈ Set.range (sheafToPresheaf K A).obj) P
state_after: case h.h.a.mpr.intro.intro.intro.intro
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
R : Sheaf J A
e : P ≅ (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj R
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf K A).obj) P

tactic: exact ⟨G.op ⋙ R.val, ⟨(G.sheafPushforwardContinuous A K J).obj R, rfl⟩, ⟨e⟩⟩
state_before: case h.h.a.mpr.intro.intro.intro.intro
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P✝ Q : Cᵒᵖ ⥤ A
f : P✝ ⟶ Q
P : Dᵒᵖ ⥤ A
R : Sheaf J A
e : P ≅ (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj R
⊢ isoClosure (fun x => x ∈ Set.range (sheafToPresheaf K A).obj) P
state_after: no goals

tactic: rw [← Function.Bijective.of_comp_iff _
  (Functor.whiskerLeft_obj_map_bijective_of_isCoverDense J G Q R.val R.cond)]
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
R : Sheaf J A
⊢ (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
R : Sheaf J A
⊢ Function.Bijective ((fun g => whiskerLeft G.op f ≫ g) ∘ ((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map) ↔
    Function.Bijective fun g => f ≫ g

tactic: exact Function.Bijective.of_comp_iff'
  (Functor.whiskerLeft_obj_map_bijective_of_isCoverDense J G P R.val R.cond)
    (fun g ↦ f ≫ g)
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
R : Sheaf J A
⊢ Function.Bijective ((fun g => whiskerLeft G.op f ≫ g) ∘ ((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map) ↔
    Function.Bijective fun g => f ≫ g
state_after: no goals

tactic: rintro h _ ⟨R, rfl⟩
state_before: case h.mp
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
⊢ LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)
      (((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f) →
    LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A).obj) f
state_after: case h.mp.intro
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
h :
  LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)
    (((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f)
R : Sheaf J A
⊢ Function.Bijective fun g => f ≫ g

tactic: exact (h₂ R).1 (h _ ⟨R, rfl⟩)
state_before: case h.mp.intro
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
h :
  LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)
    (((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f)
R : Sheaf J A
⊢ Function.Bijective fun g => f ≫ g
state_after: no goals

tactic: rintro h _ ⟨R, rfl⟩
state_before: case h.mpr
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
⊢ LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A).obj) f →
    LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj)
      (((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f)
state_after: case h.mpr.intro
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
h : LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A).obj) f
R : Sheaf J A
⊢ Function.Bijective fun g => ((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f ≫ g

tactic: exact (h₂ R).2 (h _ ⟨R, rfl⟩)
state_before: case h.mpr.intro
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✝⁷ : EssentiallySmall.{w, v₁, u₁} C
B : Type u_1
inst✝⁶ : Category.{?u.113258, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ⋯.inducedTopology A
inst✝⁴ : ⋯.inducedTopology.HasSheafCompose F
inst✝³ : G.IsCoverDense J
inst✝² : G.IsContinuous K J
inst✝¹ : G.Full
inst✝ : (G.sheafPushforwardContinuous A K J).EssSurj
P Q : Cᵒᵖ ⥤ A
f : P ⟶ Q
h₁ : K.W = LeftBousfield.W fun x => x ∈ Set.range (sheafToPresheaf J A ⋙ (whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).obj
h₂ : ∀ (R : Sheaf J A), (Function.Bijective fun g => whiskerLeft G.op f ≫ g) ↔ Function.Bijective fun g => f ≫ g
h : LeftBousfield.W (fun x => x ∈ Set.range (sheafToPresheaf J A).obj) f
R : Sheaf J A
⊢ Function.Bijective fun g => ((whiskeringLeft Dᵒᵖ Cᵒᵖ A).obj G.op).map f ≫ g
state_after: no goals