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

tactic: let sf : ∀ i : ι, F.1.obj (op (U i)) := fun i => F.1.map (Opens.leSupr U i).op s
state_before: C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
⊢ s = t

tactic: have sf_compatible : IsCompatible _ U sf := by
  intro i j
  simp_rw [← comp_apply, ← F.1.map_comp]
  rfl
state_before: C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
⊢ s = t

tactic: obtain ⟨gl, -, gl_uniq⟩ := F.existsUnique_gluing U sf sf_compatible
state_before: C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
sf_compatible : IsCompatible F.val U sf
⊢ s = t

tactic: trans gl
state_before: case intro.intro
C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
sf_compatible : IsCompatible F.val U sf
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ s = t

tactic: intro i j
state_before: C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
⊢ IsCompatible F.val U sf

tactic: simp_rw [← comp_apply, ← F.1.map_comp]
state_before: C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
i j : ι
⊢ (CategoryTheory.forget C).map (F.val.map (infLELeft (U i) (U j)).op) (sf i) =
    (CategoryTheory.forget C).map (F.val.map (infLERight (U i) (U j)).op) (sf j)

tactic: rfl
state_before: C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
i j : ι
⊢ (CategoryTheory.forget C).map (F.val.map ((leSupr U i).op ≫ (infLELeft (U i) (U j)).op)) s =
    (CategoryTheory.forget C).map (F.val.map ((leSupr U j).op ≫ (infLERight (U i) (U j)).op)) s

tactic: apply gl_uniq
state_before: C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
sf_compatible : IsCompatible F.val U sf
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ s = gl

tactic: intro i
state_before: case a
C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
sf_compatible : IsCompatible F.val U sf
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ IsGluing F.val U sf s

tactic: rfl
state_before: case a
C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
sf_compatible : IsCompatible F.val U sf
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
i : ι
⊢ (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s = sf i

tactic: symm
state_before: C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
sf_compatible : IsCompatible F.val U sf
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ gl = t

tactic: apply gl_uniq
state_before: C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
sf_compatible : IsCompatible F.val U sf
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ t = gl

tactic: intro i
state_before: case a
C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
sf_compatible : IsCompatible F.val U sf
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ IsGluing F.val U sf t

tactic: rw [← h]
state_before: case a
C : Type u
inst✝⁴ : Category C
inst✝³ : ConcreteCategory C
inst✝² : HasLimits C
inst✝¹ : ReflectsIsomorphisms ConcreteCategory.forget
inst✝ : PreservesLimits ConcreteCategory.forget
X : TopCat
F : Sheaf C X
ι : Type v
U : ι → Opens ↑X
s t : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
h :
  ∀ (i : ι),
    (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s =
      (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op) :=
  fun i => (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) s
sf_compatible : IsCompatible F.val U sf
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
i : ι
⊢ (CategoryTheory.forget C).map (F.val.map (leSupr U i).op) t = sf i