Theorem: TopCat.Presheaf.locally_surjective_iff_surjective_on_stalks
File: Mathlib/Topology/Sheaves/LocallySurjective.lean

tactic: constructor <;> intro hT
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
⊢ IsLocallySurjective T ↔ ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
state_after: case mp
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
⊢ ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)

case mpr
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
⊢ IsLocallySurjective T

tactic: intro x g
state_before: case mp
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
⊢ ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
state_after: case mp
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
g : (forget C).obj ((stalkFunctor C x).obj 𝒢)
⊢ ∃ a, ((stalkFunctor C x).map T) a = g

tactic: obtain ⟨U, hxU, t, rfl⟩ := 𝒢.germ_exist x g
state_before: case mp
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
g : (forget C).obj ((stalkFunctor C x).obj 𝒢)
⊢ ∃ a, ((stalkFunctor C x).map T) a = g
state_after: case mp.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
U : Opens ↑X
hxU : x ∈ U
t : (forget C).obj (𝒢.obj { unop := U })
⊢ ∃ a, ((stalkFunctor C x).map T) a = (𝒢.germ ⟨x, hxU⟩) t

tactic: rcases hT.imageSieve_mem t x hxU with ⟨V, ι, ⟨s, h_eq⟩, hxV⟩
state_before: case mp.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
U : Opens ↑X
hxU : x ∈ U
t : (forget C).obj (𝒢.obj { unop := U })
⊢ ∃ a, ((stalkFunctor C x).map T) a = (𝒢.germ ⟨x, hxU⟩) t
state_after: case mp.intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
U : Opens ↑X
hxU : x ∈ U
t : (forget C).obj (𝒢.obj { unop := U })
V : Opens ↑X
ι : V ⟶ U
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
h_eq : (T.app { unop := V }) s = (𝒢.map ι.op) t
⊢ ∃ a, ((stalkFunctor C x).map T) a = (𝒢.germ ⟨x, hxU⟩) t

tactic: use ℱ.germ ⟨x, hxV⟩ s
state_before: case mp.intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
U : Opens ↑X
hxU : x ∈ U
t : (forget C).obj (𝒢.obj { unop := U })
V : Opens ↑X
ι : V ⟶ U
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
h_eq : (T.app { unop := V }) s = (𝒢.map ι.op) t
⊢ ∃ a, ((stalkFunctor C x).map T) a = (𝒢.germ ⟨x, hxU⟩) t
state_after: case h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
U : Opens ↑X
hxU : x ∈ U
t : (forget C).obj (𝒢.obj { unop := U })
V : Opens ↑X
ι : V ⟶ U
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
h_eq : (T.app { unop := V }) s = (𝒢.map ι.op) t
⊢ ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = (𝒢.germ ⟨x, hxU⟩) t

tactic: convert stalkFunctor_map_germ_apply V ⟨x, hxV⟩ T s using 1
state_before: case h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
U : Opens ↑X
hxU : x ∈ U
t : (forget C).obj (𝒢.obj { unop := U })
V : Opens ↑X
ι : V ⟶ U
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
h_eq : (T.app { unop := V }) s = (𝒢.map ι.op) t
⊢ ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = (𝒢.germ ⟨x, hxU⟩) t
state_after: case h.e'_3
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
U : Opens ↑X
hxU : x ∈ U
t : (forget C).obj (𝒢.obj { unop := U })
V : Opens ↑X
ι : V ⟶ U
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
h_eq : (T.app { unop := V }) s = (𝒢.map ι.op) t
⊢ (𝒢.germ ⟨x, hxU⟩) t = (𝒢.germ ⟨x, hxV⟩) ((T.app { unop := V }) s)

tactic: simpa [h_eq] using (germ_res_apply 𝒢 ι ⟨x, hxV⟩ t).symm
state_before: case h.e'_3
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : IsLocallySurjective T
x : ↑X
U : Opens ↑X
hxU : x ∈ U
t : (forget C).obj (𝒢.obj { unop := U })
V : Opens ↑X
ι : V ⟶ U
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
h_eq : (T.app { unop := V }) s = (𝒢.map ι.op) t
⊢ (𝒢.germ ⟨x, hxU⟩) t = (𝒢.germ ⟨x, hxV⟩) ((T.app { unop := V }) s)
state_after: no goals

tactic: constructor
state_before: case mpr
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
⊢ IsLocallySurjective T
state_after: case mpr.imageSieve_mem
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
⊢ ∀ {U : Opens ↑X} (s : (forget C).obj (𝒢.obj { unop := U })),
    Presheaf.imageSieve T s ∈ (Opens.grothendieckTopology ↑X).sieves U

tactic: intro U t x hxU
state_before: case mpr.imageSieve_mem
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
⊢ ∀ {U : Opens ↑X} (s : (forget C).obj (𝒢.obj { unop := U })),
    Presheaf.imageSieve T s ∈ (Opens.grothendieckTopology ↑X).sieves U
state_after: case mpr.imageSieve_mem
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1

tactic: set t_x := 𝒢.germ ⟨x, hxU⟩ t with ht_x
state_before: case mpr.imageSieve_mem
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1
state_after: case mpr.imageSieve_mem
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1

tactic: obtain ⟨s_x, hs_x : ((stalkFunctor C x).map T) s_x = t_x⟩ := hT x t_x
state_before: case mpr.imageSieve_mem
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1
state_after: case mpr.imageSieve_mem.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
s_x : (forget C).obj ((stalkFunctor C x).obj ℱ)
hs_x : ((stalkFunctor C x).map T) s_x = t_x
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1

tactic: obtain ⟨V, hxV, s, rfl⟩ := ℱ.germ_exist x s_x
state_before: case mpr.imageSieve_mem.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
s_x : (forget C).obj ((stalkFunctor C x).obj ℱ)
hs_x : ((stalkFunctor C x).map T) s_x = t_x
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1
state_after: case mpr.imageSieve_mem.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1

tactic: have key_W := 𝒢.germ_eq x hxV hxU (T.app _ s) t <| by
  convert hs_x using 1
  symm
  convert stalkFunctor_map_germ_apply _ _ _ s
state_before: case mpr.imageSieve_mem.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1
state_after: case mpr.imageSieve_mem.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
key_W : ∃ W, ∃ (_ : x ∈ W), ∃ iU iV, (𝒢.map iU.op) ((T.app { unop := V }) s) = (𝒢.map iV.op) t
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1

tactic: obtain ⟨W, hxW, hWV, hWU, h_eq⟩ := key_W
state_before: case mpr.imageSieve_mem.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
key_W : ∃ W, ∃ (_ : x ∈ W), ∃ iU iV, (𝒢.map iU.op) ((T.app { unop := V }) s) = (𝒢.map iV.op) t
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1
state_after: case mpr.imageSieve_mem.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
W : Opens ↑X
hxW : x ∈ W
hWV : W ⟶ V
hWU : W ⟶ U
h_eq : (𝒢.map hWV.op) ((T.app { unop := V }) s) = (𝒢.map hWU.op) t
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1

tactic: refine ⟨W, hWU, ⟨ℱ.map hWV.op s, ?_⟩, hxW⟩
state_before: case mpr.imageSieve_mem.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
W : Opens ↑X
hxW : x ∈ W
hWV : W ⟶ V
hWU : W ⟶ U
h_eq : (𝒢.map hWV.op) ((T.app { unop := V }) s) = (𝒢.map hWU.op) t
⊢ ∃ U_1 f, (Presheaf.imageSieve T t).arrows f ∧ x ∈ U_1
state_after: case mpr.imageSieve_mem.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
W : Opens ↑X
hxW : x ∈ W
hWV : W ⟶ V
hWU : W ⟶ U
h_eq : (𝒢.map hWV.op) ((T.app { unop := V }) s) = (𝒢.map hWU.op) t
⊢ (T.app { unop := W }) ((ℱ.map hWV.op) s) = (𝒢.map hWU.op) t

tactic: convert h_eq using 1
state_before: case mpr.imageSieve_mem.intro.intro.intro.intro.intro.intro.intro.intro
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
W : Opens ↑X
hxW : x ∈ W
hWV : W ⟶ V
hWU : W ⟶ U
h_eq : (𝒢.map hWV.op) ((T.app { unop := V }) s) = (𝒢.map hWU.op) t
⊢ (T.app { unop := W }) ((ℱ.map hWV.op) s) = (𝒢.map hWU.op) t
state_after: case h.e'_2
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
W : Opens ↑X
hxW : x ∈ W
hWV : W ⟶ V
hWU : W ⟶ U
h_eq : (𝒢.map hWV.op) ((T.app { unop := V }) s) = (𝒢.map hWU.op) t
⊢ (T.app { unop := W }) ((ℱ.map hWV.op) s) = (𝒢.map hWV.op) ((T.app { unop := V }) s)

tactic: simp only [← comp_apply, T.naturality]
state_before: case h.e'_2
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
W : Opens ↑X
hxW : x ∈ W
hWV : W ⟶ V
hWU : W ⟶ U
h_eq : (𝒢.map hWV.op) ((T.app { unop := V }) s) = (𝒢.map hWU.op) t
⊢ (T.app { unop := W }) ((ℱ.map hWV.op) s) = (𝒢.map hWV.op) ((T.app { unop := V }) s)
state_after: no goals

tactic: convert hs_x using 1
state_before: C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
⊢ (𝒢.germ ⟨x, hxV⟩) ((T.app { unop := V }) s) = (𝒢.germ ⟨x, hxU⟩) t
state_after: case h.e'_2.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
e_1✝ : (forget C).obj (𝒢.stalk ↑⟨x, hxV⟩) = (forget C).obj ((stalkFunctor C x).obj 𝒢)
⊢ (𝒢.germ ⟨x, hxV⟩) ((T.app { unop := V }) s) = ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s)

tactic: symm
state_before: case h.e'_2.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
e_1✝ : (forget C).obj (𝒢.stalk ↑⟨x, hxV⟩) = (forget C).obj ((stalkFunctor C x).obj 𝒢)
⊢ (𝒢.germ ⟨x, hxV⟩) ((T.app { unop := V }) s) = ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s)
state_after: case h.e'_2.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
e_1✝ : (forget C).obj (𝒢.stalk ↑⟨x, hxV⟩) = (forget C).obj ((stalkFunctor C x).obj 𝒢)
⊢ ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = (𝒢.germ ⟨x, hxV⟩) ((T.app { unop := V }) s)

tactic: convert stalkFunctor_map_germ_apply _ _ _ s
state_before: case h.e'_2.h
C : Type u
inst✝³ : Category.{v, u} C
inst✝² : ConcreteCategory C
X : TopCat
ℱ 𝒢 : Presheaf C X
inst✝¹ : Limits.HasColimits C
inst✝ : Limits.PreservesFilteredColimits (forget C)
T : ℱ ⟶ 𝒢
hT : ∀ (x : ↑X), Function.Surjective ⇑((stalkFunctor C x).map T)
U : Opens ↑X
t : (forget C).obj (𝒢.obj { unop := U })
x : ↑X
hxU : x ∈ U
t_x : (forget C).obj (𝒢.stalk ↑⟨x, hxU⟩) := (𝒢.germ ⟨x, hxU⟩) t
ht_x : t_x = (𝒢.germ ⟨x, hxU⟩) t
V : Opens ↑X
hxV : x ∈ V
s : (forget C).obj (ℱ.obj { unop := V })
hs_x : ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = t_x
e_1✝ : (forget C).obj (𝒢.stalk ↑⟨x, hxV⟩) = (forget C).obj ((stalkFunctor C x).obj 𝒢)
⊢ ((stalkFunctor C x).map T) ((ℱ.germ ⟨x, hxV⟩) s) = (𝒢.germ ⟨x, hxV⟩) ((T.app { unop := V }) s)
state_after: no goals