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

tactic: apply getSection_is_unique
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 Z : StructuredArrow U.op (Functor.op G)
f : Y ⟶ Z
⊢ getSection hu ℱ hS hx Y ≫ ℱ.val.map f.right = getSection hu ℱ hS hx Z

tactic: intro V' fV' hV'
state_before: case 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
Y Z : StructuredArrow U.op (Functor.op G)
f : Y ⟶ Z
⊢ IsAmalgamation (pulledbackFamily ℱ S x Z) (getSection hu ℱ hS hx Y ≫ ℱ.val.map f.right)

tactic: have eq : Z.hom = Y.hom ≫ (G.map f.right.unop).op := by
  convert f.w
  erw [Category.id_comp]
state_before: case 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
Y Z : StructuredArrow U.op (Functor.op G)
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 X.op).map fV'.op (getSection hu ℱ hS hx Y ≫ ℱ.val.map f.right) =
    pulledbackFamily ℱ S x Z fV' hV'

tactic: rw [eq] at hV'
state_before: case 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
Y Z : StructuredArrow U.op (Functor.op G)
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 X.op).map fV'.op (getSection hu ℱ hS hx Y ≫ ℱ.val.map f.right) =
    pulledbackFamily ℱ S x Z fV' hV'

tactic: convert getSection_isAmalgamation hu ℱ hS hx Y (fV' ≫ f.right.unop) _ using 1
state_before: case 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
Y Z : StructuredArrow U.op (Functor.op G)
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 X.op).map fV'.op (getSection hu ℱ hS hx Y ≫ ℱ.val.map f.right) =
    pulledbackFamily ℱ S x Z fV' hV'✝

tactic: convert f.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 Z : StructuredArrow U.op (Functor.op G)
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

tactic: erw [Category.id_comp]
state_before: case h.e'_2.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
Y Z : StructuredArrow U.op (Functor.op G)
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 U.op).obj Z.left ⟶ (Functor.op G).obj Z.right) =
    ((Functor.fromPUnit U.op).obj Y.left ⟶ (Functor.op G).obj Z.right)
⊢ Z.hom = (Functor.fromPUnit U.op).map f.left ≫ Z.hom

tactic: aesop_cat
state_before: case 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 Z : StructuredArrow U.op (Functor.op G)
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 X.op).map fV'.op (getSection hu ℱ hS hx Y ≫ ℱ.val.map f.right) =
    ((𝟭 (Cᵒᵖ ⥤ A)).obj ℱ.val ⋙ coyoneda.obj X.op).map (fV' ≫ f.right.unop).op (getSection hu ℱ hS hx Y)

tactic: rw [pulledbackFamily_apply, pulledbackFamily_apply]
state_before: case h.e'_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
Y Z : StructuredArrow U.op (Functor.op G)
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

tactic: congr 2
state_before: case h.e'_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
Y Z : StructuredArrow U.op (Functor.op G)
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 (Functor.op G)).counit.app ℱ.val).app V'.op =
    x (G.map (fV' ≫ f.right.unop) ≫ Y.hom.unop) ?H ≫ ((Ran.adjunction A (Functor.op G)).counit.app ℱ.val).app V'.op

tactic: simp [eq]
state_before: case h.e'_3.e_a.e_f
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 Z : StructuredArrow U.op (Functor.op G)
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: change S (G.map _ ≫ Y.hom.unop)
state_before: case 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
Y Z : StructuredArrow U.op (Functor.op G)
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: simpa only [Functor.map_comp, Category.assoc] using hV'
state_before: case 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
Y Z : StructuredArrow U.op (Functor.op G)
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)