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 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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
⊢ ∃! s, ∀ (i : ι), (CategoryTheory.forget C).map (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 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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
⊢ ∃! s, ∀ (i : ι), (CategoryTheory.forget C).map (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 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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_spec : IsGluing F.val U sf gl
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, ∀ (i : ι), (CategoryTheory.forget C).map (F.val.map (iUV i).op) s = sf i

tactic: intro i
state_before: case intro.intro.refine'_1
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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_spec : IsGluing F.val U sf gl
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ (fun s => ∀ (i : ι), (CategoryTheory.forget C).map (F.val.map (iUV i).op) s = sf i)
    ((CategoryTheory.forget C).map (F.val.map (eqToHom V_eq_supr_U).op) gl)

tactic: rw [← comp_apply, ← F.1.map_comp]
state_before: case intro.intro.refine'_1
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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_spec : IsGluing F.val U sf gl
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 (iUV i).op)
      ((CategoryTheory.forget C).map (F.val.map (eqToHom V_eq_supr_U).op) gl) =
    sf i

tactic: exact gl_spec i
state_before: case intro.intro.refine'_1
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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_spec : IsGluing F.val U sf gl
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 ((eqToHom V_eq_supr_U).op ≫ (iUV i).op)) gl = sf i

tactic: intro gl' gl'_spec
state_before: case intro.intro.refine'_2
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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_spec : IsGluing F.val U sf gl
gl_uniq : ∀ (y : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)), (fun s => IsGluing F.val U sf s) y → y = gl
⊢ ∀ (y : (CategoryTheory.forget C).obj (F.val.obj V.op)),
    (fun s => ∀ (i : ι), (CategoryTheory.forget C).map (F.val.map (iUV i).op) s = sf i) y →
      y = (CategoryTheory.forget C).map (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 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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_spec : IsGluing F.val U sf gl
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' : (CategoryTheory.forget C).obj (F.val.obj V.op)
gl'_spec : ∀ (i : ι), (CategoryTheory.forget C).map (F.val.map (iUV i).op) gl' = sf i
⊢ gl' = (CategoryTheory.forget C).map (F.val.map (eqToHom V_eq_supr_U).op) gl

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 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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_spec : IsGluing F.val U sf gl
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' : (CategoryTheory.forget C).obj (F.val.obj V.op)
gl'_spec : ∀ (i : ι), (CategoryTheory.forget C).map (F.val.map (iUV i).op) gl' = sf i
⊢ gl' = (CategoryTheory.forget C).map (F.val.map ((eqToHom (_ : iSup U = V)).op ≫ (eqToHom V_eq_supr_U).op)) gl'

tactic: convert gl'_spec i
state_before: case intro.intro.refine'_2.convert_3
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
V : Opens ↑X
iUV : (i : ι) → U i ⟶ V
hcover : V ≤ iSup U
sf : (i : ι) → (CategoryTheory.forget C).obj (F.val.obj (U i).op)
h : IsCompatible F.val U sf
V_eq_supr_U : V = iSup U
gl : (CategoryTheory.forget C).obj (F.val.obj (iSup U).op)
gl_spec : IsGluing F.val U sf gl
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' : (CategoryTheory.forget C).obj (F.val.obj V.op)
gl'_spec : ∀ (i : ι), (CategoryTheory.forget C).map (F.val.map (iUV i).op) gl' = sf i
i : ι
⊢ (CategoryTheory.forget C).map (F.val.map ((eqToHom (_ : iSup U = V)).op ≫ (leSupr U i).op)) gl' = sf i