Theorem: CategoryTheory.Coverage.toGrothendieck_eq_sInf
File: Mathlib/CategoryTheory/Sites/Coverage.lean

tactic: apply le_antisymm
state_before: C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
⊢ toGrothendieck C K = sInf {J | K ≤ ofGrothendieck C J}
state_after: case a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
⊢ toGrothendieck C K ≤ sInf {J | K ≤ ofGrothendieck C J}

case a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
⊢ sInf {J | K ≤ ofGrothendieck C J} ≤ toGrothendieck C K

tactic: apply le_sInf
state_before: case a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
⊢ toGrothendieck C K ≤ sInf {J | K ≤ ofGrothendieck C J}
state_after: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
⊢ ∀ b ∈ {J | K ≤ ofGrothendieck C J}, toGrothendieck C K ≤ b

tactic: intro J hJ
state_before: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
⊢ ∀ b ∈ {J | K ≤ ofGrothendieck C J}, toGrothendieck C K ≤ b
state_after: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
J : GrothendieckTopology C
hJ : J ∈ {J | K ≤ ofGrothendieck C J}
⊢ toGrothendieck C K ≤ J

tactic: intro X S hS
state_before: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
J : GrothendieckTopology C
hJ : J ∈ {J | K ≤ ofGrothendieck C J}
⊢ toGrothendieck C K ≤ J
state_after: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
J : GrothendieckTopology C
hJ : J ∈ {J | K ≤ ofGrothendieck C J}
X : C
S : Sieve X
hS : S ∈ (toGrothendieck C K).sieves X
⊢ S ∈ J.sieves X

tactic: induction hS with
| of X S hS => apply hJ; assumption
| top => apply J.top_mem
| transitive X R S _ _ H1 H2 => exact J.transitive H1 _ H2
state_before: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
J : GrothendieckTopology C
hJ : J ∈ {J | K ≤ ofGrothendieck C J}
X : C
S : Sieve X
hS : S ∈ (toGrothendieck C K).sieves X
⊢ S ∈ J.sieves X
state_after: no goals

tactic: apply hJ
state_before: case a.a.of
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
J : GrothendieckTopology C
hJ : J ∈ {J | K ≤ ofGrothendieck C J}
X✝ : C
S✝ : Sieve X✝
X : C
S : Presieve X
hS : S ∈ K.covering X
⊢ Sieve.generate S ∈ J.sieves X
state_after: case a.a.of.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
J : GrothendieckTopology C
hJ : J ∈ {J | K ≤ ofGrothendieck C J}
X✝ : C
S✝ : Sieve X✝
X : C
S : Presieve X
hS : S ∈ K.covering X
⊢ S ∈ K.covering X

tactic: assumption
state_before: case a.a.of.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
J : GrothendieckTopology C
hJ : J ∈ {J | K ≤ ofGrothendieck C J}
X✝ : C
S✝ : Sieve X✝
X : C
S : Presieve X
hS : S ∈ K.covering X
⊢ S ∈ K.covering X
state_after: no goals

tactic: apply J.top_mem
state_before: case a.a.top
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
J : GrothendieckTopology C
hJ : J ∈ {J | K ≤ ofGrothendieck C J}
X : C
S : Sieve X
X✝ : C
⊢ ⊤ ∈ J.sieves X✝
state_after: no goals

tactic: exact J.transitive H1 _ H2
state_before: case a.a.transitive
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
J : GrothendieckTopology C
hJ : J ∈ {J | K ≤ ofGrothendieck C J}
X✝ : C
S✝ : Sieve X✝
X : C
R S : Sieve X
a✝¹ : K.saturate X R
a✝ : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → K.saturate Y (Sieve.pullback f S)
H1 : R ∈ J.sieves X
H2 : ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄, R.arrows f → Sieve.pullback f S ∈ J.sieves Y
⊢ S ∈ J.sieves X
state_after: no goals

tactic: apply sInf_le
state_before: case a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
⊢ sInf {J | K ≤ ofGrothendieck C J} ≤ toGrothendieck C K
state_after: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
⊢ toGrothendieck C K ∈ {J | K ≤ ofGrothendieck C J}

tactic: intro X S hS
state_before: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
⊢ toGrothendieck C K ∈ {J | K ≤ ofGrothendieck C J}
state_after: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
X : C
S : Presieve X
hS : S ∈ K.covering X
⊢ S ∈ (ofGrothendieck C (toGrothendieck C K)).covering X

tactic: apply saturate.of _ _ hS
state_before: case a.a
C : Type u_1
D : Type ?u.40115
inst✝¹ : Category.{u_2, u_1} C
inst✝ : Category.{?u.40123, ?u.40115} D
K : Coverage C
X : C
S : Presieve X
hS : S ∈ K.covering X
⊢ S ∈ (ofGrothendieck C (toGrothendieck C K)).covering X
state_after: no goals