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

Proof steps:
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
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (op (U i)))
h : IsCompatible F.val U sf
⊢ ∃! s, ∀ (i : ι), (F.val.map (iUV i).op) s = sf i
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
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (op (U i)))
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
⊢ ∃! s, ∀ (i : ι), (F.val.map (iUV i).op) s = sf i
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
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (op (U i)))
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
⊢ ∃! s, ∀ (i : ι), (F.val.map (iUV i).op) s = sf i
state_after: case intro.intro
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
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (op (U i)))
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (op (iSup U)))
gl_spec : IsGluing F.val U sf gl
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (op (iSup U)))), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ ∃! s, ∀ (i : ι), (F.val.map (iUV i).op) s = sf i
tactic: obtain ⟨gl, gl_spec, gl_uniq⟩ := F.existsUnique_gluing U sf h
state_before: case intro.intro
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
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (op (U i)))
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (op (iSup U)))
gl_spec : IsGluing F.val U sf gl
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (op (iSup U)))), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ ∃! s, ∀ (i : ι), (F.val.map (iUV i).op) s = sf i
state_after: case intro.intro.refine_1
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
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (op (U i)))
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (op (iSup U)))
gl_spec : IsGluing F.val U sf gl
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (op (iSup U)))), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ (fun s => ∀ (i : ι), (F.val.map (iUV i).op) s = sf i) ((F.val.map (eqToHom V_eq_supr_U).op) gl)

case intro.intro.refine_2
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
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (op (U i)))
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (op (iSup U)))
gl_spec : IsGluing F.val U sf gl
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (op (iSup U)))), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (op V))),
    (fun s => ∀ (i : ι), (F.val.map (iUV i).op) s = sf i) y → y = (F.val.map (eqToHom V_eq_supr_U).op) gl
tactic: refine ⟨F.1.map (eqToHom V_eq_supr_U).op gl, ?_, ?_⟩