Theorem: TopCat.Presheaf.isSheaf_of_isTerminal_of_indiscrete
File: Mathlib/Topology/Sheaves/PUnit.lean

tactic: obtain rfl | hne := eq_or_ne U ⊥
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
U : TopologicalSpace.Opens ↑X
s : Sieve U
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves U
⊢ Presieve.IsSheafFor (F ⋙ coyoneda.obj { unop := c }) s.arrows
state_after: case inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
⊢ Presieve.IsSheafFor (F ⋙ coyoneda.obj { unop := c }) s.arrows

case inr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
U : TopologicalSpace.Opens ↑X
s : Sieve U
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves U
hne : U ≠ ⊥
⊢ Presieve.IsSheafFor (F ⋙ coyoneda.obj { unop := c }) s.arrows

tactic: intro _ _
state_before: case inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
⊢ Presieve.IsSheafFor (F ⋙ coyoneda.obj { unop := c }) s.arrows
state_after: case inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
x✝ : Presieve.FamilyOfElements (F ⋙ coyoneda.obj { unop := c }) s.arrows
a✝ : x✝.Compatible
⊢ ∃! t, x✝.IsAmalgamation t

tactic: rw [@exists_unique_iff_exists _ ⟨fun _ _ => _⟩]
state_before: case inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
x✝ : Presieve.FamilyOfElements (F ⋙ coyoneda.obj { unop := c }) s.arrows
a✝ : x✝.Compatible
⊢ ∃! t, x✝.IsAmalgamation t
state_after: case inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
x✝ : Presieve.FamilyOfElements (F ⋙ coyoneda.obj { unop := c }) s.arrows
a✝ : x✝.Compatible
⊢ ∃ x, x✝.IsAmalgamation x

C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
x✝ : Presieve.FamilyOfElements (F ⋙ coyoneda.obj { unop := c }) s.arrows
a✝ : x✝.Compatible
⊢ ∀ (x x_1 : (F ⋙ coyoneda.obj { unop := c }).obj { unop := ⊥ }), x = x_1

tactic: refine ⟨it.from _, fun U hU hs => IsTerminal.hom_ext ?_ _ _⟩
state_before: case inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
x✝ : Presieve.FamilyOfElements (F ⋙ coyoneda.obj { unop := c }) s.arrows
a✝ : x✝.Compatible
⊢ ∃ x, x✝.IsAmalgamation x
state_after: case inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs✝ : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
x✝ : Presieve.FamilyOfElements (F ⋙ coyoneda.obj { unop := c }) s.arrows
a✝ : x✝.Compatible
U : TopologicalSpace.Opens ↑X
hU : U ⟶ ⊥
hs : s.arrows hU
⊢ IsTerminal (F.obj { unop := U })

tactic: rwa [le_bot_iff.1 hU.le]
state_before: case inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs✝ : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
x✝ : Presieve.FamilyOfElements (F ⋙ coyoneda.obj { unop := c }) s.arrows
a✝ : x✝.Compatible
U : TopologicalSpace.Opens ↑X
hU : U ⟶ ⊥
hs : s.arrows hU
⊢ IsTerminal (F.obj { unop := U })
state_after: no goals

tactic: apply it.hom_ext
state_before: C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊥
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊥
x✝ : Presieve.FamilyOfElements (F ⋙ coyoneda.obj { unop := c }) s.arrows
a✝ : x✝.Compatible
⊢ ∀ (x x_1 : (F ⋙ coyoneda.obj { unop := c }).obj { unop := ⊥ }), x = x_1
state_after: no goals

tactic: convert Presieve.isSheafFor_top_sieve (F ⋙ coyoneda.obj (@op C c))
state_before: case inr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
U : TopologicalSpace.Opens ↑X
s : Sieve U
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves U
hne : U ≠ ⊥
⊢ Presieve.IsSheafFor (F ⋙ coyoneda.obj { unop := c }) s.arrows
state_after: case h.e'_5.h.h.e'_4
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
U : TopologicalSpace.Opens ↑X
s : Sieve U
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves U
hne : U ≠ ⊥
⊢ s = ⊤

tactic: rw [← Sieve.id_mem_iff_eq_top]
state_before: case h.e'_5.h.h.e'_4
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
U : TopologicalSpace.Opens ↑X
s : Sieve U
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves U
hne : U ≠ ⊥
⊢ s = ⊤
state_after: case h.e'_5.h.h.e'_4
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
U : TopologicalSpace.Opens ↑X
s : Sieve U
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves U
hne : U ≠ ⊥
⊢ s.arrows (𝟙 U)

tactic: have := (U.eq_bot_or_top hind).resolve_left hne
state_before: case h.e'_5.h.h.e'_4
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
U : TopologicalSpace.Opens ↑X
s : Sieve U
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves U
hne : U ≠ ⊥
⊢ s.arrows (𝟙 U)
state_after: case h.e'_5.h.h.e'_4
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
U : TopologicalSpace.Opens ↑X
s : Sieve U
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves U
hne : U ≠ ⊥
this : U = ⊤
⊢ s.arrows (𝟙 U)

tactic: subst this
state_before: case h.e'_5.h.h.e'_4
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
U : TopologicalSpace.Opens ↑X
s : Sieve U
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves U
hne : U ≠ ⊥
this : U = ⊤
⊢ s.arrows (𝟙 U)
state_after: case h.e'_5.h.h.e'_4
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
⊢ s.arrows (𝟙 ⊤)

tactic: obtain he | ⟨⟨x⟩⟩ := isEmpty_or_nonempty X
state_before: case h.e'_5.h.h.e'_4
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
⊢ s.arrows (𝟙 ⊤)
state_after: case h.e'_5.h.h.e'_4.inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
he : IsEmpty ↑X
⊢ s.arrows (𝟙 ⊤)

case h.e'_5.h.h.e'_4.inr.intro
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
x : ↑X
⊢ s.arrows (𝟙 ⊤)

tactic: obtain ⟨U, f, hf, hm⟩ := hs x _root_.trivial
state_before: case h.e'_5.h.h.e'_4.inr.intro
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
x : ↑X
⊢ s.arrows (𝟙 ⊤)
state_after: case h.e'_5.h.h.e'_4.inr.intro.intro.intro.intro
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
x : ↑X
U : TopologicalSpace.Opens ↑X
f : U ⟶ ⊤
hf : s.arrows f
hm : x ∈ U
⊢ s.arrows (𝟙 ⊤)

tactic: obtain rfl | rfl := U.eq_bot_or_top hind
state_before: case h.e'_5.h.h.e'_4.inr.intro.intro.intro.intro
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
x : ↑X
U : TopologicalSpace.Opens ↑X
f : U ⟶ ⊤
hf : s.arrows f
hm : x ∈ U
⊢ s.arrows (𝟙 ⊤)
state_after: case h.e'_5.h.h.e'_4.inr.intro.intro.intro.intro.inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
x : ↑X
f : ⊥ ⟶ ⊤
hf : s.arrows f
hm : x ∈ ⊥
⊢ s.arrows (𝟙 ⊤)

case h.e'_5.h.h.e'_4.inr.intro.intro.intro.intro.inr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
x : ↑X
f : ⊤ ⟶ ⊤
hf : s.arrows f
hm : x ∈ ⊤
⊢ s.arrows (𝟙 ⊤)

tactic: exact (hne <| SetLike.ext'_iff.2 <| Set.univ_eq_empty_iff.2 he).elim
state_before: case h.e'_5.h.h.e'_4.inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
he : IsEmpty ↑X
⊢ s.arrows (𝟙 ⊤)
state_after: no goals

tactic: cases hm
state_before: case h.e'_5.h.h.e'_4.inr.intro.intro.intro.intro.inl
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
x : ↑X
f : ⊥ ⟶ ⊤
hf : s.arrows f
hm : x ∈ ⊥
⊢ s.arrows (𝟙 ⊤)
state_after: no goals

tactic: convert hf
state_before: case h.e'_5.h.h.e'_4.inr.intro.intro.intro.intro.inr
C : Type u
inst✝ : Category.{v, u} C
X : TopCat
hind : X.str = ⊤
F : Presheaf C X
it : IsTerminal (F.obj { unop := ⊥ })
c : C
s : Sieve ⊤
hs : s ∈ (Opens.grothendieckTopology ↑X).sieves ⊤
hne : ⊤ ≠ ⊥
x : ↑X
f : ⊤ ⟶ ⊤
hf : s.arrows f
hm : x ∈ ⊤
⊢ s.arrows (𝟙 ⊤)
state_after: no goals