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.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
⊢ Function.Surjective ⇑(f.val.app { unop := U })
state_after: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (G.val.map iVU.op) t

tactic: obtain ⟨s₀, hs₀⟩ := (h x).2 (G.presheaf.germ x t)
state_before: C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (G.val.map iVU.op) t
state_after: case intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
s₀ : (forget C).obj ((stalkFunctor C ↑x).obj F.val)
hs₀ : ((stalkFunctor C ↑x).map f.val) s₀ = (G.presheaf.germ x) t
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (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.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
s₀ : (forget C).obj ((stalkFunctor C ↑x).obj F.val)
hs₀ : ((stalkFunctor C ↑x).map f.val) s₀ = (G.presheaf.germ x) t
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (G.val.map iVU.op) t
state_after: case intro.intro.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
s₀ : (forget C).obj ((stalkFunctor C ↑x).obj F.val)
hs₀ : ((stalkFunctor C ↑x).map f.val) s₀ = (G.presheaf.germ x) t
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₁ : (F.presheaf.germ ⟨↑x, hxV₁⟩) s₁ = s₀
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (G.val.map iVU.op) t

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

tactic: rename' hs₀ => hs₁
state_before: case intro.intro.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₀ : ((stalkFunctor C ↑x).map f.val) ((F.presheaf.germ ⟨↑x, hxV₁⟩) s₁) = (G.presheaf.germ x) t
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (G.val.map iVU.op) t
state_after: case intro.intro.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₁ : ((stalkFunctor C ↑x).map f.val) ((F.presheaf.germ ⟨↑x, hxV₁⟩) s₁) = (G.presheaf.germ x) t
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (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.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₁ : ((stalkFunctor C ↑x).map f.val) ((F.presheaf.germ ⟨↑x, hxV₁⟩) s₁) = (G.presheaf.germ x) t
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (G.val.map iVU.op) t
state_after: case intro.intro.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₁ : (germ G.val ⟨↑x, hxV₁⟩) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.germ x) t
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (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.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₁ : (germ G.val ⟨↑x, hxV₁⟩) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.germ x) t
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (G.val.map iVU.op) t
state_after: case intro.intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₁ : (germ G.val ⟨↑x, hxV₁⟩) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.germ x) t
V₂ : Opens ↑X
hxV₂ : ↑x ∈ V₂
iV₂V₁ : V₂ ⟶ V₁
iV₂U : V₂ ⟶ U
heq : (G.presheaf.map iV₂V₁.op) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.map iV₂U.op) t
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (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.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₁ : (germ G.val ⟨↑x, hxV₁⟩) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.germ x) t
V₂ : Opens ↑X
hxV₂ : ↑x ∈ V₂
iV₂V₁ : V₂ ⟶ V₁
iV₂U : V₂ ⟶ U
heq : (G.presheaf.map iV₂V₁.op) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.map iV₂U.op) t
⊢ ∃ V, ∃ (_ : ↑x ∈ V), ∃ iVU s, (f.val.app { unop := V }) s = (G.val.map iVU.op) t
state_after: case h
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₁ : (germ G.val ⟨↑x, hxV₁⟩) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.germ x) t
V₂ : Opens ↑X
hxV₂ : ↑x ∈ V₂
iV₂V₁ : V₂ ⟶ V₁
iV₂U : V₂ ⟶ U
heq : (G.presheaf.map iV₂V₁.op) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.map iV₂U.op) t
⊢ (f.val.app { unop := V₂ }) ((F.val.map iV₂V₁.op) s₁) = (G.val.map iV₂U.op) t

tactic: rw [← comp_apply, f.1.naturality, comp_apply, heq]
state_before: case h
C : Type u
inst✝⁶ : Category.{v, u} C
inst✝⁵ : HasColimits C
X Y Z : TopCat
inst✝⁴ : ConcreteCategory C
inst✝³ : PreservesFilteredColimits (forget C)
inst✝² : HasLimits C
inst✝¹ : PreservesLimits (forget C)
inst✝ : (forget C).ReflectsIsomorphisms
F G : Sheaf C X
f : F ⟶ G
U : Opens ↑X
h : ∀ (x : ↥U), Function.Bijective ⇑((stalkFunctor C ↑x).map f.val)
t : (forget C).obj (G.val.obj { unop := U })
x : ↥U
V₁ : Opens ↑X
hxV₁ : ↑x ∈ V₁
s₁ : (forget C).obj (F.presheaf.obj { unop := V₁ })
hs₁ : (germ G.val ⟨↑x, hxV₁⟩) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.germ x) t
V₂ : Opens ↑X
hxV₂ : ↑x ∈ V₂
iV₂V₁ : V₂ ⟶ V₁
iV₂U : V₂ ⟶ U
heq : (G.presheaf.map iV₂V₁.op) ((f.val.app { unop := V₁ }) s₁) = (G.presheaf.map iV₂U.op) t
⊢ (f.val.app { unop := V₂ }) ((F.val.map iV₂V₁.op) s₁) = (G.val.map iV₂U.op) t
state_after: no goals