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

tactic: refine' app_surjective_of_injective_of_locally_surjective f U (fun x => (h x).1) fun t x => _
state_before: C : Type u
inst✝⁶ : Category C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : ReflectsIsomorphisms (forget C)
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : { x // x ∈ U }), Function.Bijective ((forget C).map ((stalkFunctor C ↑x).map f.val))
⊢ Function.Surjective ((forget C).map (f.val.app U.op))

tactic: obtain ⟨s₀, hs₀⟩ := (h x).2 (G.presheaf.germ x t)
state_before: C : Type u
inst✝⁶ : Category C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : ReflectsIsomorphisms (forget C)
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : { x // x ∈ U }), Function.Bijective ((forget C).map ((stalkFunctor C ↑x).map f.val))
t : (forget C).obj (G.val.obj U.op)
x : { x // x ∈ U }
⊢ ∃ V x iVU s, (forget C).map (f.val.app V.op) s = (forget C).map (G.val.map iVU.op) t

tactic: obtain ⟨V₁, hxV₁, s₁, hs₁⟩ := F.presheaf.germ_exist x.1 s₀
state_before: case intro
C : Type u
inst✝⁶ : Category C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : ReflectsIsomorphisms (forget C)
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : { x // x ∈ U }), Function.Bijective ((forget C).map ((stalkFunctor C ↑x).map f.val))
t : (forget C).obj (G.val.obj U.op)
x : { x // x ∈ U }
s₀ : (forget C).obj ((stalkFunctor C ↑x).obj F.val)
hs₀ : (forget C).map ((stalkFunctor C ↑x).map f.val) s₀ = (forget C).map (germ (Sheaf.presheaf G) x) t
⊢ ∃ V x iVU s, (forget C).map (f.val.app V.op) s = (forget C).map (G.val.map iVU.op) t

tactic: subst hs₁
state_before: case intro.intro.intro.intro
C : Type u
inst✝⁶ : Category C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : ReflectsIsomorphisms (forget C)
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : { x // x ∈ U }), Function.Bijective ((forget C).map ((stalkFunctor C ↑x).map f.val))
t : (forget C).obj (G.val.obj U.op)
x : { x // x ∈ U }
s₀ : (forget C).obj ((stalkFunctor C ↑x).obj F.val)
hs₀ : (forget C).map ((stalkFunctor C ↑x).map f.val) s₀ = (forget C).map (germ (Sheaf.presheaf G) x) t
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj ((Sheaf.presheaf F).obj V₁.op)
hs₁ : (forget C).map (germ (Sheaf.presheaf F) { val := ↑x, property := hxV₁ }) s₁ = s₀
⊢ ∃ V x iVU s, (forget C).map (f.val.app V.op) s = (forget C).map (G.val.map iVU.op) t

tactic: rename' hs₀ => hs₁
state_before: case intro.intro.intro.intro
C : Type u
inst✝⁶ : Category C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : ReflectsIsomorphisms (forget C)
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : { x // x ∈ U }), Function.Bijective ((forget C).map ((stalkFunctor C ↑x).map f.val))
t : (forget C).obj (G.val.obj U.op)
x : { x // x ∈ U }
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj ((Sheaf.presheaf F).obj V₁.op)
hs₀ :
  (forget C).map ((stalkFunctor C ↑x).map f.val)
      ((forget C).map (germ (Sheaf.presheaf F) { val := ↑x, property := hxV₁ }) s₁) =
    (forget C).map (germ (Sheaf.presheaf G) x) t
⊢ ∃ V x iVU s, (forget C).map (f.val.app V.op) s = (forget C).map (G.val.map iVU.op) t

tactic: erw [stalkFunctor_map_germ_apply V₁ ⟨x.1, hxV₁⟩ f.1 s₁] at hs₁
state_before: case intro.intro.intro.intro
C : Type u
inst✝⁶ : Category C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : ReflectsIsomorphisms (forget C)
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : { x // x ∈ U }), Function.Bijective ((forget C).map ((stalkFunctor C ↑x).map f.val))
t : (forget C).obj (G.val.obj U.op)
x : { x // x ∈ U }
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj ((Sheaf.presheaf F).obj V₁.op)
hs₁ :
  (forget C).map ((stalkFunctor C ↑x).map f.val)
      ((forget C).map (germ (Sheaf.presheaf F) { val := ↑x, property := hxV₁ }) s₁) =
    (forget C).map (germ (Sheaf.presheaf G) x) t
⊢ ∃ V x iVU s, (forget C).map (f.val.app V.op) s = (forget C).map (G.val.map iVU.op) t

tactic: obtain ⟨V₂, hxV₂, iV₂V₁, iV₂U, heq⟩ := G.presheaf.germ_eq x.1 hxV₁ x.2 _ _ hs₁
state_before: case intro.intro.intro.intro
C : Type u
inst✝⁶ : Category C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : ReflectsIsomorphisms (forget C)
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : { x // x ∈ U }), Function.Bijective ((forget C).map ((stalkFunctor C ↑x).map f.val))
t : (forget C).obj (G.val.obj U.op)
x : { x // x ∈ U }
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj ((Sheaf.presheaf F).obj V₁.op)
hs₁ :
  (forget C).map
      (colimit.ι (Functor.op (OpenNhds.inclusion ↑{ val := ↑x, property := hxV₁ }) ⋙ G.val)
        { obj := V₁, property := (_ : ↑{ val := ↑x, property := hxV₁ } ∈ V₁) }.op)
      ((forget C).map (f.val.app V₁.op) s₁) =
    (forget C).map (germ (Sheaf.presheaf G) x) t
⊢ ∃ V x iVU s, (forget C).map (f.val.app V.op) s = (forget C).map (G.val.map iVU.op) t

tactic: use V₂, hxV₂, iV₂U, F.1.map iV₂V₁.op s₁
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝⁶ : Category C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : ReflectsIsomorphisms (forget C)
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : { x // x ∈ U }), Function.Bijective ((forget C).map ((stalkFunctor C ↑x).map f.val))
t : (forget C).obj (G.val.obj U.op)
x : { x // x ∈ U }
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj ((Sheaf.presheaf F).obj V₁.op)
hs₁ :
  (forget C).map
      (colimit.ι (Functor.op (OpenNhds.inclusion ↑{ val := ↑x, property := hxV₁ }) ⋙ G.val)
        { obj := V₁, property := (_ : ↑{ val := ↑x, property := hxV₁ } ∈ V₁) }.op)
      ((forget C).map (f.val.app V₁.op) s₁) =
    (forget C).map (germ (Sheaf.presheaf G) x) t
V₂ : Opens ↑X
hxV₂ : ↑x ∈ V₂
iV₂V₁ : V₂ ⟶ V₁
iV₂U : V₂ ⟶ U
heq :
  (forget C).map ((Sheaf.presheaf G).map iV₂V₁.op) ((forget C).map (f.val.app V₁.op) s₁) =
    (forget C).map ((Sheaf.presheaf G).map iV₂U.op) t
⊢ ∃ V x iVU s, (forget C).map (f.val.app V.op) s = (forget C).map (G.val.map iVU.op) t

tactic: rw [← comp_apply, f.1.naturality, comp_apply, heq]
state_before: case intro.intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝⁶ : Category C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : ReflectsIsomorphisms (forget C)
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : { x // x ∈ U }), Function.Bijective ((forget C).map ((stalkFunctor C ↑x).map f.val))
t : (forget C).obj (G.val.obj U.op)
x : { x // x ∈ U }
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj ((Sheaf.presheaf F).obj V₁.op)
hs₁ :
  (forget C).map
      (colimit.ι (Functor.op (OpenNhds.inclusion ↑{ val := ↑x, property := hxV₁ }) ⋙ G.val)
        { obj := V₁, property := (_ : ↑{ val := ↑x, property := hxV₁ } ∈ V₁) }.op)
      ((forget C).map (f.val.app V₁.op) s₁) =
    (forget C).map (germ (Sheaf.presheaf G) x) t
V₂ : Opens ↑X
hxV₂ : ↑x ∈ V₂
iV₂V₁ : V₂ ⟶ V₁
iV₂U : V₂ ⟶ U
heq :
  (forget C).map ((Sheaf.presheaf G).map iV₂V₁.op) ((forget C).map (f.val.app V₁.op) s₁) =
    (forget C).map ((Sheaf.presheaf G).map iV₂U.op) t
⊢ (forget C).map (f.val.app V₂.op) ((forget C).map (F.val.map iV₂V₁.op) s₁) = (forget C).map (G.val.map iV₂U.op) t