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

tactic: change _ ∈ J.sieves (e.inverse.obj (e.functor.obj U))
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
U : C
S : Sieve U
h : S ∈ J.sieves U
⊢ Sieve.functorPushforward e.functor S ∈ ⋯.inducedTopology.sieves (e.functor.obj U)
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
U : C
S : Sieve U
h : S ∈ J.sieves U
⊢ Sieve.functorPushforward e.inverse (Sieve.functorPushforward e.functor S) ∈ J.sieves (e.inverse.obj (e.functor.obj U))

tactic: convert J.pullback_stable (e.unitInv.app U) h
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
U : C
S : Sieve U
h : S ∈ J.sieves U
⊢ Sieve.functorPushforward e.inverse (Sieve.functorPushforward e.functor S) ∈ J.sieves (e.inverse.obj (e.functor.obj U))
state_after: case h.e'_4.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
⊢ Sieve.functorPushforward e.inverse (Sieve.functorPushforward e.functor S) = Sieve.pullback (e.unitInv.app U) S

tactic: ext Z f
state_before: case h.e'_4.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
⊢ Sieve.functorPushforward e.inverse (Sieve.functorPushforward e.functor S) = Sieve.pullback (e.unitInv.app U) S
state_after: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ (Sieve.functorPushforward e.inverse (Sieve.functorPushforward e.functor S)).arrows f ↔
    (Sieve.pullback (e.unitInv.app U) S).arrows f

tactic: rw [← Sieve.functorPushforward_comp]
state_before: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ (Sieve.functorPushforward e.inverse (Sieve.functorPushforward e.functor S)).arrows f ↔
    (Sieve.pullback (e.unitInv.app U) S).arrows f
state_after: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ (Sieve.functorPushforward (e.functor ⋙ e.inverse) S).arrows f ↔ (Sieve.pullback (e.unitInv.app U) S).arrows f

tactic: simp only [Sieve.functorPushforward_apply, Presieve.functorPushforward, exists_and_left, id_obj,
  comp_obj, Sieve.pullback_apply]
state_before: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ (Sieve.functorPushforward (e.functor ⋙ e.inverse) S).arrows f ↔ (Sieve.pullback (e.unitInv.app U) S).arrows f
state_after: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ (∃ Z_1 g, S.arrows g ∧ ∃ x, f = x ≫ (e.functor ⋙ e.inverse).map g) ↔ S.arrows (f ≫ e.unitInv.app U)

tactic: constructor
state_before: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ (∃ Z_1 g, S.arrows g ∧ ∃ x, f = x ≫ (e.functor ⋙ e.inverse).map g) ↔ S.arrows (f ≫ e.unitInv.app U)
state_after: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ (∃ Z_1 g, S.arrows g ∧ ∃ x, f = x ≫ (e.functor ⋙ e.inverse).map g) → S.arrows (f ≫ e.unitInv.app U)

case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ S.arrows (f ≫ e.unitInv.app U) → ∃ Z_1 g, S.arrows g ∧ ∃ x, f = x ≫ (e.functor ⋙ e.inverse).map g

tactic: rintro ⟨W, g, hg, x, rfl⟩
state_before: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ (∃ Z_1 g, S.arrows g ∧ ∃ x, f = x ≫ (e.functor ⋙ e.inverse).map g) → S.arrows (f ≫ e.unitInv.app U)
state_after: case h.e'_4.h.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z W : C
g : W ⟶ U
hg : S.arrows g
x : Z ⟶ e.inverse.obj (e.functor.obj W)
⊢ S.arrows ((x ≫ (e.functor ⋙ e.inverse).map g) ≫ e.unitInv.app U)

tactic: rw [Category.assoc]
state_before: case h.e'_4.h.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z W : C
g : W ⟶ U
hg : S.arrows g
x : Z ⟶ e.inverse.obj (e.functor.obj W)
⊢ S.arrows ((x ≫ (e.functor ⋙ e.inverse).map g) ≫ e.unitInv.app U)
state_after: case h.e'_4.h.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z W : C
g : W ⟶ U
hg : S.arrows g
x : Z ⟶ e.inverse.obj (e.functor.obj W)
⊢ S.arrows (x ≫ (e.functor ⋙ e.inverse).map g ≫ e.unitInv.app U)

tactic: apply S.downward_closed
state_before: case h.e'_4.h.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z W : C
g : W ⟶ U
hg : S.arrows g
x : Z ⟶ e.inverse.obj (e.functor.obj W)
⊢ S.arrows (x ≫ (e.functor ⋙ e.inverse).map g ≫ e.unitInv.app U)
state_after: case h.e'_4.h.h.mp.intro.intro.intro.intro.x
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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z W : C
g : W ⟶ U
hg : S.arrows g
x : Z ⟶ e.inverse.obj (e.functor.obj W)
⊢ S.arrows ((e.functor ⋙ e.inverse).map g ≫ e.unitInv.app U)

tactic: simpa using S.downward_closed hg _
state_before: case h.e'_4.h.h.mp.intro.intro.intro.intro.x
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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z W : C
g : W ⟶ U
hg : S.arrows g
x : Z ⟶ e.inverse.obj (e.functor.obj W)
⊢ S.arrows ((e.functor ⋙ e.inverse).map g ≫ e.unitInv.app U)
state_after: no goals

tactic: intro hf
state_before: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
⊢ S.arrows (f ≫ e.unitInv.app U) → ∃ Z_1 g, S.arrows g ∧ ∃ x, f = x ≫ (e.functor ⋙ e.inverse).map g
state_after: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
hf : S.arrows (f ≫ e.unitInv.app U)
⊢ ∃ Z_1 g, S.arrows g ∧ ∃ x, f = x ≫ (e.functor ⋙ e.inverse).map g

tactic: exact ⟨_, e.unitInv.app Z ≫ f ≫ e.unitInv.app U, S.downward_closed hf _,
  e.unit.app Z ≫ e.unit.app _, by simp⟩
state_before: case h.e'_4.h.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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
hf : S.arrows (f ≫ e.unitInv.app U)
⊢ ∃ Z_1 g, S.arrows g ∧ ∃ x, f = x ≫ (e.functor ⋙ e.inverse).map g
state_after: no goals

tactic: simp
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
U : C
S : Sieve U
h : S ∈ J.sieves U
e_1✝ : Sieve (e.inverse.obj (e.functor.obj U)) = Sieve ((e.functor ⋙ e.inverse).obj U)
Z : C
f : Z ⟶ e.inverse.obj (e.functor.obj U)
hf : S.arrows (f ≫ e.unitInv.app U)
⊢ f =
    (e.unit.app Z ≫ e.unit.app (e.inverse.obj (e.functor.obj Z))) ≫
      (e.functor ⋙ e.inverse).map (e.unitInv.app Z ≫ f ≫ e.unitInv.app U)
state_after: no goals