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

tactic: rcases germ_exist F x s with ⟨U₁, hxU₁, s, rfl⟩
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 G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
s t : (forget C).obj ((stalkFunctor C x).obj F)
hst : ((stalkFunctor C x).map f) s = ((stalkFunctor C x).map f) t
⊢ s = t
state_after: case 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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
t : (forget C).obj ((stalkFunctor C x).obj F)
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
hst : ((stalkFunctor C x).map f) ((F.germ ⟨x, hxU₁⟩) s) = ((stalkFunctor C x).map f) t
⊢ (F.germ ⟨x, hxU₁⟩) s = t

tactic: rcases germ_exist F x t with ⟨U₂, hxU₂, t, rfl⟩
state_before: case 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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
t : (forget C).obj ((stalkFunctor C x).obj F)
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
hst : ((stalkFunctor C x).map f) ((F.germ ⟨x, hxU₁⟩) s) = ((stalkFunctor C x).map f) t
⊢ (F.germ ⟨x, hxU₁⟩) s = t
state_after: case 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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : ((stalkFunctor C x).map f) ((F.germ ⟨x, hxU₁⟩) s) = ((stalkFunctor C x).map f) ((F.germ ⟨x, hxU₂⟩) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t

tactic: erw [stalkFunctor_map_germ_apply _ ⟨x, _⟩] at hst
state_before: case 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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : ((stalkFunctor C x).map f) ((F.germ ⟨x, hxU₁⟩) s) = ((stalkFunctor C x).map f) ((F.germ ⟨x, hxU₂⟩) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t
state_after: case 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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = ((stalkFunctor C x).map f) ((F.germ ⟨x, hxU₂⟩) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t

tactic: erw [stalkFunctor_map_germ_apply _ ⟨x, _⟩] at hst
state_before: case 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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = ((stalkFunctor C x).map f) ((F.germ ⟨x, hxU₂⟩) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t
state_after: case 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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t

tactic: obtain ⟨W, hxW, iWU₁, iWU₂, heq⟩ := G.germ_eq x hxU₁ hxU₂ _ _ hst
state_before: case 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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t
state_after: case intro.intro.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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (G.map iWU₁.op) ((f.app { unop := U₁ }) s) = (G.map iWU₂.op) ((f.app { unop := U₂ }) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t

tactic: rw [← comp_apply, ← comp_apply, ← f.naturality, ← f.naturality, comp_apply, comp_apply] at heq
state_before: case intro.intro.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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (G.map iWU₁.op) ((f.app { unop := U₁ }) s) = (G.map iWU₂.op) ((f.app { unop := U₂ }) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t
state_after: case intro.intro.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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (f.app { unop := W }) ((F.map iWU₁.op) s) = (f.app { unop := W }) ((F.map iWU₂.op) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t

tactic: replace heq := h W heq
state_before: case intro.intro.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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (f.app { unop := W }) ((F.map iWU₁.op) s) = (f.app { unop := W }) ((F.map iWU₂.op) t)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t
state_after: case intro.intro.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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (F.map iWU₁.op) s = (F.map iWU₂.op) t
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t

tactic: convert congr_arg (F.germ ⟨x, hxW⟩) heq using 1
state_before: case intro.intro.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)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (F.map iWU₁.op) s = (F.map iWU₂.op) t
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxU₂⟩) t
state_after: case h.e'_2.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (F.map iWU₁.op) s = (F.map iWU₂.op) t
e_1✝ : (forget C).obj ((stalkFunctor C x).obj F) = (forget C).obj (F.stalk ↑⟨x, hxW⟩)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxW⟩) ((F.map iWU₁.op) s)

case h.e'_3.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (F.map iWU₁.op) s = (F.map iWU₂.op) t
e_1✝ : (forget C).obj ((stalkFunctor C x).obj F) = (forget C).obj (F.stalk ↑⟨x, hxW⟩)
⊢ (F.germ ⟨x, hxU₂⟩) t = (F.germ ⟨x, hxW⟩) ((F.map iWU₂.op) t)

tactic: exacts [(F.germ_res_apply iWU₁ ⟨x, hxW⟩ s).symm, (F.germ_res_apply iWU₂ ⟨x, hxW⟩ t).symm]
state_before: case h.e'_2.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (F.map iWU₁.op) s = (F.map iWU₂.op) t
e_1✝ : (forget C).obj ((stalkFunctor C x).obj F) = (forget C).obj (F.stalk ↑⟨x, hxW⟩)
⊢ (F.germ ⟨x, hxU₁⟩) s = (F.germ ⟨x, hxW⟩) ((F.map iWU₁.op) s)

case h.e'_3.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : HasColimits C
X Y Z : TopCat
inst✝¹ : ConcreteCategory C
inst✝ : PreservesFilteredColimits (forget C)
F G : Presheaf C X
f : F ⟶ G
h : ∀ (U : Opens ↑X), Function.Injective ⇑(f.app { unop := U })
x : ↑X
U₁ : Opens ↑X
hxU₁ : x ∈ U₁
s : (forget C).obj (F.obj { unop := U₁ })
U₂ : Opens ↑X
hxU₂ : x ∈ U₂
t : (forget C).obj (F.obj { unop := U₂ })
hst : (G.germ ⟨x, hxU₁⟩) ((f.app { unop := U₁ }) s) = (G.germ ⟨x, hxU₂⟩) ((f.app { unop := U₂ }) t)
W : Opens ↑X
hxW : x ∈ W
iWU₁ : W ⟶ U₁
iWU₂ : W ⟶ U₂
heq : (F.map iWU₁.op) s = (F.map iWU₂.op) t
e_1✝ : (forget C).obj ((stalkFunctor C x).obj F) = (forget C).obj (F.stalk ↑⟨x, hxW⟩)
⊢ (F.germ ⟨x, hxU₂⟩) t = (F.germ ⟨x, hxW⟩) ((F.map iWU₂.op) t)
state_after: no goals