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

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₂)
⊢ 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: 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
⊢ 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: 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
⊢ 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: 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 = ⊤
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: 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 ⊤
⊢ ⟨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: 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⦄,
    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: ext1
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: 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
⊢ ↑((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: 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
⊢ 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: apply J₂.top_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: intro Y f _
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₂.IsClosed ⊤
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
Y : C
f : Y ⟶ X
a✝ : J₂.Covers ⊤ f
⊢ ⊤.arrows f

tactic: 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
Y : C
f : Y ⟶ X
a✝ : J₂.Covers ⊤ f
⊢ ⊤.arrows f
state_after: no goals

tactic: rw [Subtype.ext_iff] at 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 ⊤
this : ⟨J₂.close S, ⋯⟩ = ⟨⊤, this✝⟩
⊢ 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 ⊤
this : ↑⟨J₂.close S, ⋯⟩ = ↑⟨⊤, this✝⟩
⊢ J₂.close S = ⊤

tactic: 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 ⊤
this : ↑⟨J₂.close S, ⋯⟩ = ↑⟨⊤, this✝⟩
⊢ J₂.close S = ⊤
state_after: no goals