Theorem: TopCat.Presheaf.isSheaf_iff_isSheafOpensLeCover
File: Mathlib/Topology/Sheaves/SheafCondition/OpensLeCover.lean

tactic: refine (Presheaf.isSheaf_iff_isLimit _ _).trans ?_
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ F.IsSheaf ↔ F.IsSheafOpensLeCover
state_after: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ (∀ ⦃X_1 : Opens ↑X⦄,
      ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))) ↔
    F.IsSheafOpensLeCover

tactic: constructor
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ (∀ ⦃X_1 : Opens ↑X⦄,
      ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))) ↔
    F.IsSheafOpensLeCover
state_after: case mp
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ (∀ ⦃X_1 : Opens ↑X⦄,
      ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))) →
    F.IsSheafOpensLeCover

case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ F.IsSheafOpensLeCover →
    ∀ ⦃X_1 : Opens ↑X⦄,
      ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))

tactic: intro h ι U
state_before: case mp
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ (∀ ⦃X_1 : Opens ↑X⦄,
      ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))) →
    F.IsSheafOpensLeCover
state_after: case mp
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι✝ : Type w
U✝ : ι✝ → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U✝
h :
  ∀ ⦃X_1 : Opens ↑X⦄,
    ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))
ι : Type w
U : ι → Opens ↑X
⊢ Nonempty (IsLimit (Functor.mapCone F (opensLeCoverCocone U).op))

tactic: rw [(isLimitOpensLeEquivGenerate₁ F U rfl).nonempty_congr]
state_before: case mp
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι✝ : Type w
U✝ : ι✝ → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U✝
h :
  ∀ ⦃X_1 : Opens ↑X⦄,
    ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))
ι : Type w
U : ι → Opens ↑X
⊢ Nonempty (IsLimit (Functor.mapCone F (opensLeCoverCocone U).op))
state_after: case mp
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι✝ : Type w
U✝ : ι✝ → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U✝
h :
  ∀ ⦃X_1 : Opens ↑X⦄,
    ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))
ι : Type w
U : ι → Opens ↑X
⊢ Nonempty (IsLimit (Functor.mapCone F (Sieve.generate (presieveOfCoveringAux U (iSup U))).arrows.cocone.op))

tactic: apply h
state_before: case mp
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι✝ : Type w
U✝ : ι✝ → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U✝
h :
  ∀ ⦃X_1 : Opens ↑X⦄,
    ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))
ι : Type w
U : ι → Opens ↑X
⊢ Nonempty (IsLimit (Functor.mapCone F (Sieve.generate (presieveOfCoveringAux U (iSup U))).arrows.cocone.op))
state_after: case mp.a
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι✝ : Type w
U✝ : ι✝ → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U✝
h :
  ∀ ⦃X_1 : Opens ↑X⦄,
    ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))
ι : Type w
U : ι → Opens ↑X
⊢ Sieve.generate (presieveOfCoveringAux U (iSup U)) ∈ (Opens.grothendieckTopology ↑X).sieves (iSup U)

tactic: apply presieveOfCovering.mem_grothendieckTopology
state_before: case mp.a
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι✝ : Type w
U✝ : ι✝ → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U✝
h :
  ∀ ⦃X_1 : Opens ↑X⦄,
    ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))
ι : Type w
U : ι → Opens ↑X
⊢ Sieve.generate (presieveOfCoveringAux U (iSup U)) ∈ (Opens.grothendieckTopology ↑X).sieves (iSup U)
state_after: no goals

tactic: intro h Y S
state_before: case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y : Opens ↑X
hY : Y = iSup U
⊢ F.IsSheafOpensLeCover →
    ∀ ⦃X_1 : Opens ↑X⦄,
      ∀ S ∈ (Opens.grothendieckTopology ↑X).sieves X_1, Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))
state_after: case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y✝ : Opens ↑X
hY : Y✝ = iSup U
h : F.IsSheafOpensLeCover
Y : Opens ↑X
S : Sieve Y
⊢ S ∈ (Opens.grothendieckTopology ↑X).sieves Y → Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))

tactic: rw [← Sieve.generate_sieve S]
state_before: case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y✝ : Opens ↑X
hY : Y✝ = iSup U
h : F.IsSheafOpensLeCover
Y : Opens ↑X
S : Sieve Y
⊢ S ∈ (Opens.grothendieckTopology ↑X).sieves Y → Nonempty (IsLimit (Functor.mapCone F S.arrows.cocone.op))
state_after: case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y✝ : Opens ↑X
hY : Y✝ = iSup U
h : F.IsSheafOpensLeCover
Y : Opens ↑X
S : Sieve Y
⊢ Sieve.generate S.arrows ∈ (Opens.grothendieckTopology ↑X).sieves Y →
    Nonempty (IsLimit (Functor.mapCone F (Sieve.generate S.arrows).arrows.cocone.op))

tactic: intro hS
state_before: case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y✝ : Opens ↑X
hY : Y✝ = iSup U
h : F.IsSheafOpensLeCover
Y : Opens ↑X
S : Sieve Y
⊢ Sieve.generate S.arrows ∈ (Opens.grothendieckTopology ↑X).sieves Y →
    Nonempty (IsLimit (Functor.mapCone F (Sieve.generate S.arrows).arrows.cocone.op))
state_after: case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y✝ : Opens ↑X
hY : Y✝ = iSup U
h : F.IsSheafOpensLeCover
Y : Opens ↑X
S : Sieve Y
hS : Sieve.generate S.arrows ∈ (Opens.grothendieckTopology ↑X).sieves Y
⊢ Nonempty (IsLimit (Functor.mapCone F (Sieve.generate S.arrows).arrows.cocone.op))

tactic: rw [← (isLimitOpensLeEquivGenerate₂ F S.1 hS).nonempty_congr]
state_before: case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y✝ : Opens ↑X
hY : Y✝ = iSup U
h : F.IsSheafOpensLeCover
Y : Opens ↑X
S : Sieve Y
hS : Sieve.generate S.arrows ∈ (Opens.grothendieckTopology ↑X).sieves Y
⊢ Nonempty (IsLimit (Functor.mapCone F (Sieve.generate S.arrows).arrows.cocone.op))
state_after: case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y✝ : Opens ↑X
hY : Y✝ = iSup U
h : F.IsSheafOpensLeCover
Y : Opens ↑X
S : Sieve Y
hS : Sieve.generate S.arrows ∈ (Opens.grothendieckTopology ↑X).sieves Y
⊢ Nonempty (IsLimit (Functor.mapCone F (opensLeCoverCocone (coveringOfPresieve Y S.arrows)).op))

tactic: apply h
state_before: case mpr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
F : Presheaf C X
ι : Type w
U : ι → Opens ↑X
Y✝ : Opens ↑X
hY : Y✝ = iSup U
h : F.IsSheafOpensLeCover
Y : Opens ↑X
S : Sieve Y
hS : Sieve.generate S.arrows ∈ (Opens.grothendieckTopology ↑X).sieves Y
⊢ Nonempty (IsLimit (Functor.mapCone F (opensLeCoverCocone (coveringOfPresieve Y S.arrows)).op))
state_after: no goals