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

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
⊢ x.IsAmalgamation (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
V : D
fV : V ⟶ U
hV : S.arrows fV
⊢ ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV.op (gluedSection ℱ hS hx) = x fV hV

tactic: refine limit.hom_ext (fun (W : StructuredArrow (op V) 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
V : D
fV : V ⟶ U
hV : S.arrows fV
⊢ ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV.op (gluedSection ℱ hS hx) = x fV 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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow { unop := V } G.op
⊢ ((ran G.op).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV.op (gluedSection ℱ hS hx) ≫
      limit.π (Ran.diagram G.op ℱ.val { unop := V }) W =
    x fV hV ≫ limit.π (Ran.diagram G.op ℱ.val { unop := V }) W

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

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

tactic: convert helper ℱ hS hx _ (x fV hV) _ _ using 1
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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow { unop := V } G.op
⊢ x fV hV ≫ limit.π (Ran.diagram G.op ℱ.val { unop := V }) W =
    (Cone.whisker (StructuredArrow.map fV.op) (gluedLimitCone ℱ hS hx)).π.app W
state_after: case convert_3
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
V : D
fV : V ⟶ U
hV : S.arrows fV
W : StructuredArrow { unop := V } G.op
⊢ ∀ {V' : C} {fV_1 : G.obj V' ⟶ V} (hV_1 : S.arrows (fV_1 ≫ fV)),
    x fV hV ≫ ((ran G.op).obj ℱ.val).map fV_1.op = x (fV_1 ≫ fV) hV_1

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

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

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

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