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

tactic: apply getSection_is_unique
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
⊢ getSection ℱ hS hx Y ≫ ℱ.val.map f.right = getSection ℱ hS hx Z
state_after: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
⊢ (pulledbackFamily ℱ S x Z).IsAmalgamation (getSection ℱ hS hx Y ≫ ℱ.val.map f.right)

tactic: intro V' fV' hV'
state_before: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
⊢ (pulledbackFamily ℱ S x Z).IsAmalgamation (getSection ℱ hS hx Y ≫ ℱ.val.map f.right)
state_after: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV' : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
⊢ ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV'.op (getSection ℱ hS hx Y ≫ ℱ.val.map f.right) =
    pulledbackFamily ℱ S x Z fV' hV'

tactic: have eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op := by
  convert f.w using 1
  erw [Category.id_comp]
state_before: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV' : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
⊢ ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV'.op (getSection ℱ hS hx Y ≫ ℱ.val.map f.right) =
    pulledbackFamily ℱ S x Z fV' hV'
state_after: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV' : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV'.op (getSection ℱ hS hx Y ≫ ℱ.val.map f.right) =
    pulledbackFamily ℱ S x Z fV' hV'

tactic: rw [eq] at hV'
state_before: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV' : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV'.op (getSection ℱ hS hx Y ≫ ℱ.val.map f.right) =
    pulledbackFamily ℱ S x Z fV' hV'
state_after: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV'.op (getSection ℱ hS hx Y ≫ ℱ.val.map f.right) =
    pulledbackFamily ℱ S x Z fV' hV'✝

tactic: convert getSection_isAmalgamation ℱ hS hx Y (fV' ≫ f.right.unop) _ using 1
state_before: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV'.op (getSection ℱ hS hx Y ≫ ℱ.val.map f.right) =
    pulledbackFamily ℱ S x Z fV' hV'✝
state_after: case h.e'_2
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV'.op (getSection ℱ hS hx Y ≫ ℱ.val.map f.right) =
    ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map (fV' ≫ f.right.unop).op (getSection ℱ hS hx Y)

case h.e'_3
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ pulledbackFamily ℱ S x Z fV' hV'✝ = pulledbackFamily ℱ S x Y (fV' ≫ f.right.unop) ?H

case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ Presieve.functorPullback G (Sieve.pullback Y.hom.unop S).arrows (fV' ≫ f.right.unop)

tactic: convert f.w using 1
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV' : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
⊢ Z.hom = Y.hom ≫ (G.map f.right.unop).op
state_after: case h.e'_2.h
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV' : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
e_1✝ :
  ((Functor.fromPUnit { unop := U }).obj Z.left ⟶ G.op.obj Z.right) =
    ((Functor.fromPUnit { unop := U }).obj Y.left ⟶ G.op.obj Z.right)
⊢ Z.hom = (Functor.fromPUnit { unop := U }).map f.left ≫ Z.hom

tactic: erw [Category.id_comp]
state_before: case h.e'_2.h
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV' : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
e_1✝ :
  ((Functor.fromPUnit { unop := U }).obj Z.left ⟶ G.op.obj Z.right) =
    ((Functor.fromPUnit { unop := U }).obj Y.left ⟶ G.op.obj Z.right)
⊢ Z.hom = (Functor.fromPUnit { unop := U }).map f.left ≫ Z.hom
state_after: no goals

tactic: aesop_cat
state_before: case h.e'_2
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map fV'.op (getSection ℱ hS hx Y ≫ ℱ.val.map f.right) =
    ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj { unop := X }).map (fV' ≫ f.right.unop).op (getSection ℱ hS hx Y)
state_after: no goals

tactic: rw [pulledbackFamily_apply, pulledbackFamily_apply]
state_before: case h.e'_3
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ pulledbackFamily ℱ S x Z fV' hV'✝ = pulledbackFamily ℱ S x Y (fV' ≫ f.right.unop) ?H
state_after: case h.e'_3
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ x (G.map fV' ≫ Z.hom.unop) hV'✝ ≫ ((Ran.adjunction A G.op).counit.app ℱ.val).app { unop := V' } =
    x (G.map (fV' ≫ f.right.unop) ≫ Y.hom.unop) ?H ≫ ((Ran.adjunction A G.op).counit.app ℱ.val).app { unop := V' }

tactic: congr 2
state_before: case h.e'_3
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ x (G.map fV' ≫ Z.hom.unop) hV'✝ ≫ ((Ran.adjunction A G.op).counit.app ℱ.val).app { unop := V' } =
    x (G.map (fV' ≫ f.right.unop) ≫ Y.hom.unop) ?H ≫ ((Ran.adjunction A G.op).counit.app ℱ.val).app { unop := V' }
state_after: case h.e'_3.e_a.e_f
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ G.map fV' ≫ Z.hom.unop = G.map (fV' ≫ f.right.unop) ≫ Y.hom.unop

tactic: simp [eq]
state_before: case h.e'_3.e_a.e_f
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ G.map fV' ≫ Z.hom.unop = G.map (fV' ≫ f.right.unop) ≫ Y.hom.unop
state_after: no goals

tactic: change S (G.map _ ≫ Y.hom.unop)
state_before: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ Presieve.functorPullback G (Sieve.pullback Y.hom.unop S).arrows (fV' ≫ f.right.unop)
state_after: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ S.arrows (G.map (fV' ≫ f.right.unop) ≫ Y.hom.unop)

tactic: simpa only [Functor.map_comp, Category.assoc] using hV'
state_before: case H
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, 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 Z : StructuredArrow { unop := U } G.op
f : Y ⟶ Z
V' : C
fV' : V' ⟶ Z.right.unop
hV'✝ : Presieve.functorPullback G (Sieve.pullback Z.hom.unop S).arrows fV'
hV' : Presieve.functorPullback G (Sieve.pullback (Y.hom ≫ (G.map f.right.unop).op).unop S).arrows fV'
eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op
⊢ S.arrows (G.map (fV' ≫ f.right.unop) ≫ Y.hom.unop)
state_after: no goals