Theorem: TopCat.Sheaf.existsUnique_gluing'
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
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj { unop := 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 { unop := 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: obtain ⟨gl, gl_spec, gl_uniq⟩ := F.existsUnique_gluing U sf h
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 { unop := 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := 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: refine ⟨F.1.map (eqToHom V_eq_supr_U).op gl, ?_, ?_⟩
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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := 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: intro i
state_before: 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := 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)
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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
i : ι
⊢ (F.val.map (iUV i).op) ((F.val.map (eqToHom V_eq_supr_U).op) gl) = sf i

tactic: rw [← comp_apply, ← F.1.map_comp]
state_before: 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
i : ι
⊢ (F.val.map (iUV i).op) ((F.val.map (eqToHom V_eq_supr_U).op) gl) = 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
i : ι
⊢ (F.val.map ((eqToHom V_eq_supr_U).op ≫ (iUV i).op)) gl = sf i

tactic: exact gl_spec i
state_before: 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
i : ι
⊢ (F.val.map ((eqToHom V_eq_supr_U).op ≫ (iUV i).op)) gl = sf i
state_after: no goals

tactic: intro gl' gl'_spec
state_before: 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := 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
state_after: 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
gl' : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
gl'_spec : ∀ (i : ι), (F.val.map (iUV i).op) gl' = sf i
⊢ gl' = (F.val.map (eqToHom V_eq_supr_U).op) gl

tactic: convert congr_arg _ (gl_uniq (F.1.map (eqToHom V_eq_supr_U.symm).op gl') fun i => _) <;>
  rw [← comp_apply, ← F.1.map_comp]
state_before: 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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
gl' : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
gl'_spec : ∀ (i : ι), (F.val.map (iUV i).op) gl' = sf i
⊢ gl' = (F.val.map (eqToHom V_eq_supr_U).op) gl
state_after: case h.e'_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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
gl' : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
gl'_spec : ∀ (i : ι), (F.val.map (iUV i).op) gl' = sf i
⊢ gl' = (F.val.map ((eqToHom ⋯).op ≫ (eqToHom V_eq_supr_U).op)) gl'

case intro.intro.refine_2.convert_3
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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
gl' : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
gl'_spec : ∀ (i : ι), (F.val.map (iUV i).op) gl' = sf i
i : ι
⊢ (F.val.map ((eqToHom ⋯).op ≫ (leSupr U i).op)) gl' = sf i

tactic: rw [eqToHom_op, eqToHom_op, eqToHom_trans, eqToHom_refl, F.1.map_id, id_apply]
state_before: case h.e'_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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
gl' : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
gl'_spec : ∀ (i : ι), (F.val.map (iUV i).op) gl' = sf i
⊢ gl' = (F.val.map ((eqToHom ⋯).op ≫ (eqToHom V_eq_supr_U).op)) gl'
state_after: no goals

tactic: convert gl'_spec i
state_before: case intro.intro.refine_2.convert_3
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 { unop := U i })
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })
gl_spec : IsGluing F.val U sf gl
gl_uniq :
  ∀ (y : (CategoryTheory.forget C).obj (F.val.obj { unop := iSup U })), (fun s => IsGluing F.val U sf s) y → y = gl
gl' : (CategoryTheory.forget C).obj (F.val.obj { unop := V })
gl'_spec : ∀ (i : ι), (F.val.map (iUV i).op) gl' = sf i
i : ι
⊢ (F.val.map ((eqToHom ⋯).op ≫ (leSupr U i).op)) gl' = sf i
state_after: no goals