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

Proof steps:
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.102181, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ((equivSmallModel C).inverse.inducedTopology J) A
inst✝⁴ : ((equivSmallModel C).inverse.inducedTopology J).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.102181, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ((equivSmallModel C).inverse.inducedTopology J) A
inst✝⁴ : ((equivSmallModel C).inverse.inducedTopology J).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: ext P Q f
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.102181, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ((equivSmallModel C).inverse.inducedTopology J) A
inst✝⁴ : ((equivSmallModel C).inverse.inducedTopology J).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.102181, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ((equivSmallModel C).inverse.inducedTopology J) A
inst✝⁴ : ((equivSmallModel C).inverse.inducedTopology J).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: 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.102181, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ((equivSmallModel C).inverse.inducedTopology J) A
inst✝⁴ : ((equivSmallModel C).inverse.inducedTopology J).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.102181, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ((equivSmallModel C).inverse.inducedTopology J) A
inst✝⁴ : ((equivSmallModel C).inverse.inducedTopology J).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: 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.102181, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ((equivSmallModel C).inverse.inducedTopology J) A
inst✝⁴ : ((equivSmallModel C).inverse.inducedTopology J).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.102181, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ((equivSmallModel C).inverse.inducedTopology J) A
inst✝⁴ : ((equivSmallModel C).inverse.inducedTopology J).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.102181, u_1} B
F : A ⥤ B
inst✝⁵ : HasSheafify ((equivSmallModel C).inverse.inducedTopology J) A
inst✝⁴ : ((equivSmallModel C).inverse.inducedTopology J).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: constructor