Theorem: TopCat.stalkToFiber_injective
File: Mathlib/Topology/Sheaves/LocalPredicate.lean

tactic: let Q :
  ∃ (W : (OpenNhds x)ᵒᵖ) (s : ∀ w : (unop W).1, T w) (hW : P.pred s),
    tU = (subsheafToTypes P).presheaf.germ ⟨x, (unop W).2⟩ ⟨s, hW⟩ ∧
      tV = (subsheafToTypes P).presheaf.germ ⟨x, (unop W).2⟩ ⟨s, hW⟩ :=
  ?_
state_before: X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
tU tV : (subsheafToTypes P).presheaf.stalk x
h : stalkToFiber P x tU = stalkToFiber P x tV
⊢ tU = tV
state_after: case refine_2
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
tU tV : (subsheafToTypes P).presheaf.stalk x
h : stalkToFiber P x tU = stalkToFiber P x tV
Q : ∃ W s,
  ∃ (hW : P.pred s),
    tU = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧ tV = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ :=
  ?refine_1
⊢ tU = tV

case refine_1
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
tU tV : (subsheafToTypes P).presheaf.stalk x
h : stalkToFiber P x tU = stalkToFiber P x tV
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      tU = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧ tV = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩

tactic: obtain ⟨U, ⟨fU, hU⟩, rfl⟩ := jointly_surjective'.{v, v} tU
state_before: case refine_1
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
tU tV : (subsheafToTypes P).presheaf.stalk x
h : stalkToFiber P x tU = stalkToFiber P x tV
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      tU = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧ tV = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩
state_after: case refine_1.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
tV : (subsheafToTypes P).presheaf.stalk x
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
h :
  stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        U ⟨fU, hU⟩) =
    stalkToFiber P x tV
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι
            (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
              (subsheafToTypes P).presheaf)
            U ⟨fU, hU⟩ =
          (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        tV = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩

tactic: obtain ⟨V, ⟨fV, hV⟩, rfl⟩ := jointly_surjective'.{v, v} tV
state_before: case refine_1.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
tV : (subsheafToTypes P).presheaf.stalk x
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
h :
  stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        U ⟨fU, hU⟩) =
    stalkToFiber P x tV
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι
            (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
              (subsheafToTypes P).presheaf)
            U ⟨fU, hU⟩ =
          (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        tV = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩
state_after: case refine_1.intro.intro.mk.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h :
  stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        U ⟨fU, hU⟩) =
    stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        V ⟨fV, hV⟩)
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι
            (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
              (subsheafToTypes P).presheaf)
            U ⟨fU, hU⟩ =
          (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι
            (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
              (subsheafToTypes P).presheaf)
            V ⟨fV, hV⟩ =
          (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩

tactic: dsimp
state_before: case refine_1.intro.intro.mk.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h :
  stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        U ⟨fU, hU⟩) =
    stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        V ⟨fV, hV⟩)
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι
            (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
              (subsheafToTypes P).presheaf)
            U ⟨fU, hU⟩ =
          (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι
            (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
              (subsheafToTypes P).presheaf)
            V ⟨fV, hV⟩ =
          (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩
state_after: case refine_1.intro.intro.mk.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h :
  stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        U ⟨fU, hU⟩) =
    stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        V ⟨fV, hV⟩)
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩

tactic: simp only [stalkToFiber, Types.Colimit.ι_desc_apply'] at h
state_before: case refine_1.intro.intro.mk.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h :
  stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        U ⟨fU, hU⟩) =
    stalkToFiber P x
      (colimit.ι
        (((whiskeringLeft (OpenNhds x)ᵒᵖ (Opens ↑X)ᵒᵖ (Type v)).obj (OpenNhds.inclusion x).op).obj
          (subsheafToTypes P).presheaf)
        V ⟨fV, hV⟩)
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩
state_after: case refine_1.intro.intro.mk.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩

tactic: specialize w (unop U) (unop V) fU hU fV hV h
state_before: case refine_1.intro.intro.mk.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩
state_after: case refine_1.intro.intro.mk.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
w : ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩

tactic: rcases w with ⟨W, iU, iV, w⟩
state_before: case refine_1.intro.intro.mk.intro.intro.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
w : ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩
state_after: case refine_1.intro.intro.mk.intro.intro.mk.intro.intro.intro
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
W : OpenNhds x
iU : W ⟶ U.unop
iV : W ⟶ V.unop
w : ∀ (w : ↥W.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩

tactic: refine ⟨op W, fun w => fU (iU w : (unop U).1), P.res ?_ _ hU, ?_⟩
state_before: case refine_1.intro.intro.mk.intro.intro.mk.intro.intro.intro
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
W : OpenNhds x
iU : W ⟶ U.unop
iV : W ⟶ V.unop
w : ∀ (w : ↥W.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ ∃ W s,
    ∃ (hW : P.pred s),
      colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧
        colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
          (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨s, hW⟩
state_after: case refine_1.intro.intro.mk.intro.intro.mk.intro.intro.intro.refine_1
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
W : OpenNhds x
iU : W ⟶ U.unop
iV : W ⟶ V.unop
w : ∀ (w : ↥W.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ { unop := W }.unop.obj ⟶ U.unop.obj

case refine_1.intro.intro.mk.intro.intro.mk.intro.intro.intro.refine_2
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
W : OpenNhds x
iU : W ⟶ U.unop
iV : W ⟶ V.unop
w : ∀ (w : ↥W.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
      (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨fun w => fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w), ⋯⟩ ∧
    colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
      (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨fun w => fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w), ⋯⟩

tactic: choose W s hW e using Q
state_before: case refine_2
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
tU tV : (subsheafToTypes P).presheaf.stalk x
h : stalkToFiber P x tU = stalkToFiber P x tV
Q : ∃ W s,
  ∃ (hW : P.pred s),
    tU = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧ tV = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ :=
  ?refine_1
⊢ tU = tV
state_after: case refine_2
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
tU tV : (subsheafToTypes P).presheaf.stalk x
h : stalkToFiber P x tU = stalkToFiber P x tV
W : (OpenNhds x)ᵒᵖ
s : (w : ↥W.unop.obj) → T ↑w
hW : P.pred s
e : tU = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧ tV = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩
⊢ tU = tV

tactic: exact e.1.trans e.2.symm
state_before: case refine_2
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
w :
  ∀ (U V : OpenNhds x) (fU : (y : ↥U.obj) → T ↑y),
    P.pred fU →
      ∀ (fV : (y : ↥V.obj) → T ↑y),
        P.pred fV →
          fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩ →
            ∃ W iU iV, ∀ (w : ↥W.obj), fU ((fun x_4 => ⟨↑x_4, ⋯⟩) w) = fV ((fun x_4 => ⟨↑x_4, ⋯⟩) w)
tU tV : (subsheafToTypes P).presheaf.stalk x
h : stalkToFiber P x tU = stalkToFiber P x tV
W : (OpenNhds x)ᵒᵖ
s : (w : ↥W.unop.obj) → T ↑w
hW : P.pred s
e : tU = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩ ∧ tV = (subsheafToTypes P).presheaf.germ ⟨x, ⋯⟩ ⟨s, hW⟩
⊢ tU = tV
state_after: no goals

tactic: rcases W with ⟨W, m⟩
state_before: case refine_1.intro.intro.mk.intro.intro.mk.intro.intro.intro.refine_1
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
W : OpenNhds x
iU : W ⟶ U.unop
iV : W ⟶ V.unop
w : ∀ (w : ↥W.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ { unop := W }.unop.obj ⟶ U.unop.obj
state_after: case refine_1.intro.intro.mk.intro.intro.mk.intro.intro.intro.refine_1.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
W : Opens ↑X
m : x ∈ W
iU : { obj := W, property := m } ⟶ U.unop
iV : { obj := W, property := m } ⟶ V.unop
w : ∀ (w : ↥{ obj := W, property := m }.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ { unop := { obj := W, property := m } }.unop.obj ⟶ U.unop.obj

tactic: exact iU
state_before: case refine_1.intro.intro.mk.intro.intro.mk.intro.intro.intro.refine_1.mk
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
W : Opens ↑X
m : x ∈ W
iU : { obj := W, property := m } ⟶ U.unop
iV : { obj := W, property := m } ⟶ V.unop
w : ∀ (w : ↥{ obj := W, property := m }.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ { unop := { obj := W, property := m } }.unop.obj ⟶ U.unop.obj
state_after: no goals

tactic: exact ⟨colimit_sound iU.op (Subtype.eq rfl), colimit_sound iV.op (Subtype.eq (funext w).symm)⟩
state_before: case refine_1.intro.intro.mk.intro.intro.mk.intro.intro.intro.refine_2
X : TopCat
T : ↑X → Type v
P : LocalPredicate T
x : ↑X
U : (OpenNhds x)ᵒᵖ
fU : (x_1 : ↥((OpenNhds.inclusion x).op.obj U).unop) → T ↑x_1
hU : P.pred fU
V : (OpenNhds x)ᵒᵖ
fV : (x_1 : ↥((OpenNhds.inclusion x).op.obj V).unop) → T ↑x_1
hV : P.pred fV
h : fU ⟨x, ⋯⟩ = fV ⟨x, ⋯⟩
W : OpenNhds x
iU : W ⟶ U.unop
iV : W ⟶ V.unop
w : ∀ (w : ↥W.obj), fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w) = fV ((fun x_1 => ⟨↑x_1, ⋯⟩) w)
⊢ colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) U ⟨fU, hU⟩ =
      (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨fun w => fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w), ⋯⟩ ∧
    colimit.ι ((OpenNhds.inclusion x).op ⋙ subpresheafToTypes P.toPrelocalPredicate) V ⟨fV, hV⟩ =
      (subpresheafToTypes P.toPrelocalPredicate).germ ⟨x, ⋯⟩ ⟨fun w => fU ((fun x_1 => ⟨↑x_1, ⋯⟩) w), ⋯⟩
state_after: no goals