Theorem: CategoryTheory.RanIsSheafOfIsCocontinuous.gluedSection_is_unique
File: Mathlib/CategoryTheory/Sites/CoverLifting.lean

tactic: unfold gluedSection limit.lift
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
⊢ y = gluedSection ℱ hS hx
state_after: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
⊢ y = (limit.isLimit (Ran.diagram G.op ℱ.val { unop := U })).lift (gluedLimitCone ℱ hS hx)

tactic: refine limit.hom_ext (fun (W : StructuredArrow (op U) G.op) ↦ ?_)
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
⊢ y = (limit.isLimit (Ran.diagram G.op ℱ.val { unop := U })).lift (gluedLimitCone ℱ hS hx)
state_after: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
⊢ y ≫ limit.π (Ran.diagram G.op ℱ.val { unop := U }) W =
    (limit.isLimit (Ran.diagram G.op ℱ.val { unop := U })).lift (gluedLimitCone ℱ hS hx) ≫
      limit.π (Ran.diagram G.op ℱ.val { unop := U }) W

tactic: erw [limit.lift_π]
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
⊢ y ≫ limit.π (Ran.diagram G.op ℱ.val { unop := U }) W =
    (limit.isLimit (Ran.diagram G.op ℱ.val { unop := U })).lift (gluedLimitCone ℱ hS hx) ≫
      limit.π (Ran.diagram G.op ℱ.val { unop := U }) W
state_after: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
⊢ y ≫ limit.π (Ran.diagram G.op ℱ.val { unop := U }) W = (gluedLimitCone ℱ hS hx).π.app W

tactic: convert helper ℱ hS hx (𝟙 _) y W _
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
⊢ y ≫ limit.π (Ran.diagram G.op ℱ.val { unop := U }) W = (gluedLimitCone ℱ hS hx).π.app W
state_after: case h.e'_3.h.e'_8
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
⊢ W = (StructuredArrow.map (𝟙 U).op).obj W

C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
⊢ ∀ {V' : C} {fV : G.obj V' ⟶ U} (hV : S.arrows (fV ≫ 𝟙 U)), y ≫ ((ran G.op).obj ℱ.val).map fV.op = x (fV ≫ 𝟙 U) hV

tactic: simp only [op_id, StructuredArrow.map_id]
state_before: case h.e'_3.h.e'_8
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
⊢ W = (StructuredArrow.map (𝟙 U).op).obj W
state_after: no goals

tactic: intro V' fV' hV'
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
⊢ ∀ {V' : C} {fV : G.obj V' ⟶ U} (hV : S.arrows (fV ≫ 𝟙 U)), y ≫ ((ran G.op).obj ℱ.val).map fV.op = x (fV ≫ 𝟙 U) hV
state_after: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
V' : C
fV' : G.obj V' ⟶ U
hV' : S.arrows (fV' ≫ 𝟙 U)
⊢ y ≫ ((ran G.op).obj ℱ.val).map fV'.op = x (fV' ≫ 𝟙 U) hV'

tactic: convert hy fV' (by simpa only [Category.comp_id] using hV')
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
V' : C
fV' : G.obj V' ⟶ U
hV' : S.arrows (fV' ≫ 𝟙 U)
⊢ y ≫ ((ran G.op).obj ℱ.val).map fV'.op = x (fV' ≫ 𝟙 U) hV'
state_after: case h.e'_3.h.h.e'_2
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
V' : C
fV' : G.obj V' ⟶ U
hV' : S.arrows (fV' ≫ 𝟙 U)
e_1✝ :
  (X ⟶ ((ran G.op).obj ℱ.val).obj { unop := G.obj V' }) =
    ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := G.obj V' }
⊢ fV' ≫ 𝟙 U = fV'

tactic: erw [Category.comp_id]
state_before: case h.e'_3.h.h.e'_2
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
V' : C
fV' : G.obj V' ⟶ U
hV' : S.arrows (fV' ≫ 𝟙 U)
e_1✝ :
  (X ⟶ ((ran G.op).obj ℱ.val).obj { unop := G.obj V' }) =
    ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := G.obj V' }
⊢ fV' ≫ 𝟙 U = fV'
state_after: no goals

tactic: simpa only [Category.comp_id] using hV'
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_4, u_1} C
inst✝³ : Category.{u_3, u_2} D
G : C ⥤ D
A : Type w
inst✝² : Category.{w', w} A
inst✝¹ : ∀ (X : Dᵒᵖ), HasLimitsOfShape (StructuredArrow X G.op) A
J : GrothendieckTopology C
K : GrothendieckTopology D
inst✝ : G.IsCocontinuous J K
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ K.sieves U
x : FamilyOfElements ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }) S.arrows
hx : x.Compatible
y : ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).obj { unop := U }
hy : x.IsAmalgamation y
W : StructuredArrow { unop := U } G.op
V' : C
fV' : G.obj V' ⟶ U
hV' : S.arrows (fV' ≫ 𝟙 U)
⊢ S.arrows fV'
state_after: no goals