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 C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
⊢ J₁ ≤ J₂

tactic: rw [← J₂.close_eq_top_iff_mem]
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
⊢ S ∈ GrothendieckTopology.sieves J₂ X

tactic: have : J₂.IsClosed (⊤ : Sieve X) := by
  intro Y f _
  trivial
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
⊢ GrothendieckTopology.close J₂ 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 C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this : GrothendieckTopology.IsClosed J₂ ⊤
⊢ GrothendieckTopology.close J₂ S = ⊤

tactic: apply (h S hS).isSeparatedFor.ext
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this : GrothendieckTopology.IsClosed J₂ ⊤
⊢ { val := GrothendieckTopology.close J₂ S,
      property := (_ : GrothendieckTopology.IsClosed J₂ (GrothendieckTopology.close J₂ S)) } =
    { val := ⊤, property := this }

tactic: intro Y f _
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
⊢ GrothendieckTopology.IsClosed J₂ ⊤

tactic: trivial
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
Y : C
f : Y ⟶ X
a✝ : GrothendieckTopology.Covers J₂ ⊤ f
⊢ ⊤.arrows f

tactic: rw [Subtype.ext_iff] at this
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this✝ : GrothendieckTopology.IsClosed J₂ ⊤
this :
  { val := GrothendieckTopology.close J₂ S,
      property := (_ : GrothendieckTopology.IsClosed J₂ (GrothendieckTopology.close J₂ S)) } =
    { val := ⊤, property := this✝ }
⊢ GrothendieckTopology.close J₂ S = ⊤

tactic: exact this
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this✝ : GrothendieckTopology.IsClosed J₂ ⊤
this :
  ↑{ val := GrothendieckTopology.close J₂ S,
        property := (_ : GrothendieckTopology.IsClosed J₂ (GrothendieckTopology.close J₂ S)) } =
    ↑{ val := ⊤, property := this✝ }
⊢ GrothendieckTopology.close J₂ S = ⊤

tactic: intro Y f hf
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this : GrothendieckTopology.IsClosed J₂ ⊤
⊢ ∀ ⦃Y : C⦄ ⦃f : Y ⟶ X⦄,
    S.arrows f →
      (Functor.closedSieves J₂).map f.op
          { val := GrothendieckTopology.close J₂ S,
            property := (_ : GrothendieckTopology.IsClosed J₂ (GrothendieckTopology.close J₂ S)) } =
        (Functor.closedSieves J₂).map f.op { val := ⊤, property := this }

tactic: simp only [Functor.closedSieves_obj]
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this : GrothendieckTopology.IsClosed J₂ ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ (Functor.closedSieves J₂).map f.op
      { val := GrothendieckTopology.close J₂ S,
        property := (_ : GrothendieckTopology.IsClosed J₂ (GrothendieckTopology.close J₂ S)) } =
    (Functor.closedSieves J₂).map f.op { val := ⊤, property := this }

tactic: ext1
state_before: C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this : GrothendieckTopology.IsClosed J₂ ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ (Functor.closedSieves J₂).map f.op
      { val := GrothendieckTopology.close J₂ S,
        property := (_ : GrothendieckTopology.IsClosed J₂ (GrothendieckTopology.close J₂ S)) } =
    (Functor.closedSieves J₂).map f.op { val := ⊤, property := this }

tactic: dsimp
state_before: case a
C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this : GrothendieckTopology.IsClosed J₂ ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ ↑((Functor.closedSieves J₂).map f.op
        { val := GrothendieckTopology.close J₂ S,
          property := (_ : GrothendieckTopology.IsClosed J₂ (GrothendieckTopology.close J₂ S)) }) =
    ↑((Functor.closedSieves J₂).map f.op { val := ⊤, property := this })

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 C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this : GrothendieckTopology.IsClosed J₂ ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ Sieve.pullback f (GrothendieckTopology.close J₂ S) = Sieve.pullback f ⊤

tactic: apply J₂.top_mem
state_before: case a
C : Type u
inst✝ : Category C
J₁✝ J₂✝ J₁ J₂ : GrothendieckTopology C
h : Presieve.IsSheaf J₁ (Functor.closedSieves J₂)
X : C
S : Sieve X
hS : S ∈ GrothendieckTopology.sieves J₁ X
this : GrothendieckTopology.IsClosed J₂ ⊤
Y : C
f : Y ⟶ X
hf : S.arrows f
⊢ ⊤ ∈ GrothendieckTopology.sieves J₂ Y