Theorem: TopCat.Presheaf.germ_exist
File: Mathlib/Topology/Sheaves/Stalks.lean

Proof steps:
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
⊢ ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
state_after: case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
U : (OpenNhds x)ᵒᵖ
s : (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj U
e :
  ((forget C).mapCocone
            (colimit.cocone
              (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
      U s =
    t
⊢ ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
tactic: obtain ⟨U, s, e⟩ :=
    Types.jointly_surjective.{v, v} _ (isColimitOfPreserves (forget C) (colimit.isColimit _)) t
state_before: case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
U : (OpenNhds x)ᵒᵖ
s : (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj U
e :
  ((forget C).mapCocone
            (colimit.cocone
              (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
      U s =
    t
⊢ ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
state_after: case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
U : (OpenNhds x)ᵒᵖ
⊢ ∀ (s : (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj U),
    ((forget C).mapCocone
                (colimit.cocone
                  (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
          U s =
        t →
      ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
tactic: revert s e
state_before: case intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
U : (OpenNhds x)ᵒᵖ
⊢ ∀ (s : (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj U),
    ((forget C).mapCocone
                (colimit.cocone
                  (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
          U s =
        t →
      ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
state_after: case intro.intro.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
U : OpenNhds x
⊢ ∀ (s : (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj (op U)),
    ((forget C).mapCocone
                (colimit.cocone
                  (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
          (op U) s =
        t →
      ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
tactic: induction U with | h U => ?_
state_before: case intro.intro.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
U : OpenNhds x
⊢ ∀ (s : (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj (op U)),
    ((forget C).mapCocone
                (colimit.cocone
                  (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
          (op U) s =
        t →
      ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
state_after: case intro.intro.h.mk
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
V : Opens ↑X
m : x ∈ V
⊢ ∀
    (s :
      (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj
        (op { obj := V, property := m })),
    ((forget C).mapCocone
                (colimit.cocone
                  (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
          (op { obj := V, property := m }) s =
        t →
      ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
tactic: cases' U with V m
state_before: case intro.intro.h.mk
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
V : Opens ↑X
m : x ∈ V
⊢ ∀
    (s :
      (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj
        (op { obj := V, property := m })),
    ((forget C).mapCocone
                (colimit.cocone
                  (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
          (op { obj := V, property := m }) s =
        t →
      ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
state_after: case intro.intro.h.mk
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
V : Opens ↑X
m : x ∈ V
s :
  (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj
    (op { obj := V, property := m })
e :
  ((forget C).mapCocone
            (colimit.cocone
              (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
      (op { obj := V, property := m }) s =
    t
⊢ ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
tactic: intro s e
state_before: case intro.intro.h.mk
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F : Presheaf C X
x : ↑X
t : (forget C).obj (F.stalk x)
V : Opens ↑X
m : x ∈ V
s :
  (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F ⋙ forget C).obj
    (op { obj := V, property := m })
e :
  ((forget C).mapCocone
            (colimit.cocone
              (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ C).obj (OpenNhds.inclusion x).op).obj F))).ι.app
      (op { obj := V, property := m }) s =
    t
⊢ ∃ U, ∃ (m : x ∈ U), ∃ s, (F.germ ⟨x, m⟩) s = t
state_after: no goals
tactic: exact ⟨V, m, s, e⟩