Theorem: CategoryTheory.le_topology_of_closedSieves_isSheaf
File: Mathlib/CategoryTheory/Sites/Closed.lean

Proof steps:
state_before: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
⊢ J₁ ≤ J₂
state_after: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
⊢ S ∈ J₂.sieves X
tactic: intro X S hS
state_before: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
⊢ S ∈ J₂.sieves X
state_after: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
⊢ J₂.close S = ⊤
tactic: rw [← J₂.close_eq_top_iff_mem]
state_before: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
⊢ J₂.close S = ⊤
state_after: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
⊢ J₂.close S = ⊤
tactic: have : J₂.IsClosed (⊤ : Sieve X) := by
    intro Y f _
    trivial
state_before: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
⊢ J₂.close S = ⊤
state_after: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
⊢ ⟨J₂.close S, ⋯⟩ = ⟨⊤, this⟩
tactic: suffices (⟨J₂.close S, J₂.close_isClosed S⟩ : Subtype _) = ⟨⊤, this⟩ by
    rw [Subtype.ext_iff] at this
    exact this
state_before: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
⊢ ⟨J₂.close S, ⋯⟩ = ⟨⊤, this⟩
state_after: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → (Functor.closedSieves J₂).map f.op ⟨J₂.close S, ⋯⟩ = (Functor.closedSieves J₂).map f.op ⟨⊤, this⟩
tactic: apply (h S hS).isSeparatedFor.ext
state_before: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f → (Functor.closedSieves J₂).map f.op ⟨J₂.close S, ⋯⟩ = (Functor.closedSieves J₂).map f.op ⟨⊤, this⟩
state_after: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ (Functor.closedSieves J₂).map f.op ⟨J₂.close S, ⋯⟩ = (Functor.closedSieves J₂).map f.op ⟨⊤, this⟩
tactic: intro Y f hf
state_before: C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ (Functor.closedSieves J₂).map f.op ⟨J₂.close S, ⋯⟩ = (Functor.closedSieves J₂).map f.op ⟨⊤, this⟩
state_after: case a
C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ ↑((Functor.closedSieves J₂).map f.op ⟨J₂.close S, ⋯⟩) = ↑((Functor.closedSieves J₂).map f.op ⟨⊤, this⟩)
tactic: ext1
state_before: case a
C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ ↑((Functor.closedSieves J₂).map f.op ⟨J₂.close S, ⋯⟩) = ↑((Functor.closedSieves J₂).map f.op ⟨⊤, this⟩)
state_after: case a
C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ Sieve.pullback f (J₂.close S) = Sieve.pullback f ⊤
tactic: dsimp
state_before: case a
C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ Sieve.pullback f (J₂.close S) = Sieve.pullback f ⊤
state_after: case a
C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ ⊤ ∈ J₂.sieves Y
tactic: rw [Sieve.pullback_top, ← J₂.pullback_close, S.pullback_eq_top_of_mem hf,
    J₂.close_eq_top_iff_mem]
state_before: case a
C : Type u
inst✝ : Category.{v, u} C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ J₁.sieves X
this : J₂.IsClosed ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ ⊤ ∈ J₂.sieves Y
state_after: no goals
tactic: apply J₂.top_mem