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

tactic: unfold gluedSection limit.lift
state_before: C D : Type u
inst✝³ : Category C
inst✝² : Category D
A : Type w
inst✝¹ : Category A
inst✝ : HasLimits A
J : GrothendieckTopology C
K : GrothendieckTopology D
G : C ⥤ D
hu : CoverLifting J K G
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ GrothendieckTopology.sieves K U
x : FamilyOfElements ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op) S.arrows
hx : Compatible x
y : ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj U.op
hy : IsAmalgamation x y
⊢ y = gluedSection hu ℱ hS hx

tactic: refine limit.hom_ext (λ (W : StructuredArrow (op U) G.op) => ?_)
state_before: C D : Type u
inst✝³ : Category C
inst✝² : Category D
A : Type w
inst✝¹ : Category A
inst✝ : HasLimits A
J : GrothendieckTopology C
K : GrothendieckTopology D
G : C ⥤ D
hu : CoverLifting J K G
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ GrothendieckTopology.sieves K U
x : FamilyOfElements ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op) S.arrows
hx : Compatible x
y : ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj U.op
hy : IsAmalgamation x y
⊢ y = IsLimit.lift (limit.isLimit (Ran.diagram (Functor.op G) ℱ.val U.op)) (gluedLimitCone hu ℱ hS hx)

tactic: erw [limit.lift_π]
state_before: C D : Type u
inst✝³ : Category C
inst✝² : Category D
A : Type w
inst✝¹ : Category A
inst✝ : HasLimits A
J : GrothendieckTopology C
K : GrothendieckTopology D
G : C ⥤ D
hu : CoverLifting J K G
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ GrothendieckTopology.sieves K U
x : FamilyOfElements ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op) S.arrows
hx : Compatible x
y : ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj U.op
hy : IsAmalgamation x y
W : StructuredArrow U.op (Functor.op G)
⊢ y ≫ limit.π (Ran.diagram (Functor.op G) ℱ.val U.op) W =
    IsLimit.lift (limit.isLimit (Ran.diagram (Functor.op G) ℱ.val U.op)) (gluedLimitCone hu ℱ hS hx) ≫
      limit.π (Ran.diagram (Functor.op G) ℱ.val U.op) W

tactic: convert helper hu ℱ hS hx (𝟙 _) y W _
state_before: C D : Type u
inst✝³ : Category C
inst✝² : Category D
A : Type w
inst✝¹ : Category A
inst✝ : HasLimits A
J : GrothendieckTopology C
K : GrothendieckTopology D
G : C ⥤ D
hu : CoverLifting J K G
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ GrothendieckTopology.sieves K U
x : FamilyOfElements ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op) S.arrows
hx : Compatible x
y : ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj U.op
hy : IsAmalgamation x y
W : StructuredArrow U.op (Functor.op G)
⊢ y ≫ limit.π (Ran.diagram (Functor.op G) ℱ.val U.op) W = (gluedLimitCone hu ℱ hS hx).π.app W

tactic: simp only [op_id, StructuredArrow.map_id]
state_before: case h.e'_3.h.h.e'_8
C D : Type u
inst✝³ : Category C
inst✝² : Category D
A : Type w
inst✝¹ : Category A
inst✝ : HasLimits A
J : GrothendieckTopology C
K : GrothendieckTopology D
G : C ⥤ D
hu : CoverLifting J K G
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ GrothendieckTopology.sieves K U
x : FamilyOfElements ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op) S.arrows
hx : Compatible x
y : ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj U.op
hy : IsAmalgamation x y
W : StructuredArrow U.op (Functor.op G)
e_1✝ : (X.op.unop ⟶ (Ran.diagram (Functor.op G) ℱ.val U.op).obj W) = (X ⟶ (Ran.diagram (Functor.op G) ℱ.val U.op).obj W)
⊢ W = (StructuredArrow.map (𝟙 U).op).obj W

tactic: intro V' fV' hV'
state_before: C D : Type u
inst✝³ : Category C
inst✝² : Category D
A : Type w
inst✝¹ : Category A
inst✝ : HasLimits A
J : GrothendieckTopology C
K : GrothendieckTopology D
G : C ⥤ D
hu : CoverLifting J K G
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ GrothendieckTopology.sieves K U
x : FamilyOfElements ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op) S.arrows
hx : Compatible x
y : ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj U.op
hy : IsAmalgamation x y
W : StructuredArrow U.op (Functor.op G)
⊢ ∀ {V' : C} {fV : G.obj V' ⟶ U} (hV : S.arrows (fV ≫ 𝟙 U)),
    y ≫ ((ran (Functor.op G)).obj ℱ.val).map fV.op = x (fV ≫ 𝟙 U) hV

tactic: convert hy fV' (by simpa only [Category.comp_id] using hV')
state_before: C D : Type u
inst✝³ : Category C
inst✝² : Category D
A : Type w
inst✝¹ : Category A
inst✝ : HasLimits A
J : GrothendieckTopology C
K : GrothendieckTopology D
G : C ⥤ D
hu : CoverLifting J K G
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ GrothendieckTopology.sieves K U
x : FamilyOfElements ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op) S.arrows
hx : Compatible x
y : ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj U.op
hy : IsAmalgamation x y
W : StructuredArrow U.op (Functor.op G)
V' : C
fV' : G.obj V' ⟶ U
hV' : S.arrows (fV' ≫ 𝟙 U)
⊢ y ≫ ((ran (Functor.op G)).obj ℱ.val).map fV'.op = x (fV' ≫ 𝟙 U) hV'

tactic: erw [Category.comp_id]
state_before: case h.e'_3.h.h.e'_2
C D : Type u
inst✝³ : Category C
inst✝² : Category D
A : Type w
inst✝¹ : Category A
inst✝ : HasLimits A
J : GrothendieckTopology C
K : GrothendieckTopology D
G : C ⥤ D
hu : CoverLifting J K G
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ GrothendieckTopology.sieves K U
x : FamilyOfElements ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op) S.arrows
hx : Compatible x
y : ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj U.op
hy : IsAmalgamation x y
W : StructuredArrow U.op (Functor.op G)
V' : C
fV' : G.obj V' ⟶ U
hV' : S.arrows (fV' ≫ 𝟙 U)
e_1✝ :
  (X ⟶ ((ran (Functor.op G)).obj ℱ.val).obj (G.obj V').op) =
    ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj (G.obj V').op
⊢ fV' ≫ 𝟙 U = fV'

tactic: simpa only [Category.comp_id] using hV'
state_before: C D : Type u
inst✝³ : Category C
inst✝² : Category D
A : Type w
inst✝¹ : Category A
inst✝ : HasLimits A
J : GrothendieckTopology C
K : GrothendieckTopology D
G : C ⥤ D
hu : CoverLifting J K G
ℱ : Sheaf J A
X : A
U : D
S : Sieve U
hS : S ∈ GrothendieckTopology.sieves K U
x : FamilyOfElements ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op) S.arrows
hx : Compatible x
y : ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).obj U.op
hy : IsAmalgamation x y
W : StructuredArrow U.op (Functor.op G)
V' : C
fV' : G.obj V' ⟶ U
hV' : S.arrows (fV' ≫ 𝟙 U)
⊢ S.arrows fV'