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

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
⊢ IsAmalgamation x (gluedSection hu ℱ hS hx)

tactic: refine limit.hom_ext (λ (W : StructuredArrow (op V) 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
V : D
fV : V ⟶ U
hV : S.arrows fV
⊢ ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).map fV.op (gluedSection hu ℱ hS hx) = x fV hV

tactic: simp only [Functor.comp_map, limit.lift_pre, coyoneda_obj_map, ran_obj_map, gluedSection]
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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow V.op (Functor.op G)
⊢ ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).map fV.op (gluedSection hu ℱ hS hx) ≫
      limit.π (Ran.diagram (Functor.op G) ℱ.val V.op) W =
    x fV hV ≫ limit.π (Ran.diagram (Functor.op G) ℱ.val V.op) W

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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow V.op (Functor.op G)
⊢ limit.lift (StructuredArrow.map fV.op ⋙ Ran.diagram (Functor.op G) ℱ.val U.op)
        (Cone.whisker (StructuredArrow.map fV.op) (gluedLimitCone hu ℱ hS hx)) ≫
      limit.π (Ran.diagram (Functor.op G) ℱ.val V.op) W =
    x fV hV ≫ limit.π (Ran.diagram (Functor.op G) ℱ.val V.op) W

tactic: symm
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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow V.op (Functor.op G)
⊢ (Cone.whisker (StructuredArrow.map fV.op) (gluedLimitCone hu ℱ hS hx)).π.app W =
    x fV hV ≫ limit.π (Ran.diagram (Functor.op G) ℱ.val V.op) W

tactic: convert helper hu ℱ hS hx _ (x fV hV) _ _ using 1
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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow V.op (Functor.op G)
⊢ x fV hV ≫ limit.π (Ran.diagram (Functor.op G) ℱ.val V.op) W =
    (Cone.whisker (StructuredArrow.map fV.op) (gluedLimitCone hu ℱ hS hx)).π.app W

tactic: intro V' fV' hV'
state_before: case convert_3
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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow V.op (Functor.op G)
⊢ ∀ {V' : C} {fV_1 : G.obj V' ⟶ V} (hV_1 : S.arrows (fV_1 ≫ fV)),
    x fV hV ≫ ((ran (Functor.op G)).obj ℱ.val).map fV_1.op = x (fV_1 ≫ fV) hV_1

tactic: convert hx fV' (𝟙 _) hV hV' (by rw [Category.id_comp])
state_before: case convert_3
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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow V.op (Functor.op G)
V' : C
fV' : G.obj V' ⟶ V
hV' : S.arrows (fV' ≫ fV)
⊢ x fV hV ≫ ((ran (Functor.op G)).obj ℱ.val).map fV'.op = x (fV' ≫ fV) hV'

tactic: simp only [op_id, FunctorToTypes.map_id_apply]
state_before: case h.e'_3.h
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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow V.op (Functor.op G)
V' : C
fV' : G.obj V' ⟶ V
hV' : S.arrows (fV' ≫ fV)
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
⊢ x (fV' ≫ fV) hV' = ((ran (Functor.op G)).obj ℱ.val ⋙ coyoneda.obj X.op).map (𝟙 (G.obj V')).op (x (fV' ≫ fV) hV')

tactic: rw [Category.id_comp]
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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow V.op (Functor.op G)
V' : C
fV' : G.obj V' ⟶ V
hV' : S.arrows (fV' ≫ fV)
⊢ fV' ≫ fV = 𝟙 (G.obj V') ≫ fV' ≫ fV