Theorem: TopCat.Sheaf.eq_of_locally_eq'
File: Mathlib/Topology/Sheaves/SheafCondition/UniqueGluing.lean

tactic: have V_eq_supr_U : V = iSup U := le_antisymm hcover (iSup_le fun i => (iUV i).le)
state_before: C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
⊢ s = t
state_after: C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
⊢ s = t

tactic: suffices F.1.map (eqToHom V_eq_supr_U.symm).op s = F.1.map (eqToHom V_eq_supr_U.symm).op t by
  convert congr_arg (F.1.map (eqToHom V_eq_supr_U).op) this <;>
  rw [← comp_apply, ← F.1.map_comp, eqToHom_op, eqToHom_op, eqToHom_trans, eqToHom_refl,
    F.1.map_id, id_apply]
state_before: C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
⊢ s = t
state_after: C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
⊢ (F.val.map (eqToHom ⋯).op) s = (F.val.map (eqToHom ⋯).op) t

tactic: apply eq_of_locally_eq
state_before: C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
⊢ (F.val.map (eqToHom ⋯).op) s = (F.val.map (eqToHom ⋯).op) t
state_after: case h
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
⊢ ∀ (i : ι),
    (F.val.map (leSupr U i).op) ((F.val.map (eqToHom ⋯).op) s) =
      (F.val.map (leSupr U i).op) ((F.val.map (eqToHom ⋯).op) t)

tactic: intro i
state_before: case h
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
⊢ ∀ (i : ι),
    (F.val.map (leSupr U i).op) ((F.val.map (eqToHom ⋯).op) s) =
      (F.val.map (leSupr U i).op) ((F.val.map (eqToHom ⋯).op) t)
state_after: case h
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
i : ι
⊢ (F.val.map (leSupr U i).op) ((F.val.map (eqToHom ⋯).op) s) =
    (F.val.map (leSupr U i).op) ((F.val.map (eqToHom ⋯).op) t)

tactic: rw [← comp_apply, ← comp_apply, ← F.1.map_comp]
state_before: case h
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
i : ι
⊢ (F.val.map (leSupr U i).op) ((F.val.map (eqToHom ⋯).op) s) =
    (F.val.map (leSupr U i).op) ((F.val.map (eqToHom ⋯).op) t)
state_after: case h
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
i : ι
⊢ (F.val.map ((eqToHom ⋯).op ≫ (leSupr U i).op)) s = (F.val.map ((eqToHom ⋯).op ≫ (leSupr U i).op)) t

tactic: convert h i
state_before: case h
C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
i : ι
⊢ (F.val.map ((eqToHom ⋯).op ≫ (leSupr U i).op)) s = (F.val.map ((eqToHom ⋯).op ≫ (leSupr U i).op)) t
state_after: no goals

tactic: convert congr_arg (F.1.map (eqToHom V_eq_supr_U).op) this <;>
rw [← comp_apply, ← F.1.map_comp, eqToHom_op, eqToHom_op, eqToHom_trans, eqToHom_refl,
  F.1.map_id, id_apply]
state_before: C : Type u
inst✝⁴ : Category.{v, u} C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ConcreteCategory.forget.ReflectsIsomorphisms
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
s t : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
h : ∀ (i : ι), (F.val.map (iUV i).op) s = (F.val.map (iUV i).op) t
V_eq_supr_U : V = iSup U
this : (F.val.map (eqToHom ⋯).op) s = (F.val.map (eqToHom ⋯).op) t
⊢ s = t
state_after: no goals