Theorem: CategoryTheory.Functor.isContinuous_of_coverPreserving
File: Mathlib/CategoryTheory/Sites/CoverPreserving.lean

tactic: apply exists_unique_of_exists_of_unique
state_before: C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
⊢ ∃! t, x.IsAmalgamation t
state_after: case hex
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
⊢ ∃ x_1, x.IsAmalgamation x_1

case hunique
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
⊢ ∀ (y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }), x.IsAmalgamation y₁ → x.IsAmalgamation y₂ → y₁ = y₂

tactic: have H := G.2 _ (hF₂.cover_preserve hS)
state_before: case hex
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
⊢ ∃ x_1, x.IsAmalgamation x_1
state_after: case hex
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
H : IsSheafFor G.val (Sieve.functorPushforward F S).arrows
⊢ ∃ x_1, x.IsAmalgamation x_1

tactic: exact ⟨H.amalgamate (x.functorPushforward F) (hx.functorPushforward hF₁),
  fun V f hf => (H.isAmalgamation (hx.functorPushforward hF₁) (F.map f) _).trans
    (hF₁.apply_map _ hx hf)⟩
state_before: case hex
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
H : IsSheafFor G.val (Sieve.functorPushforward F S).arrows
⊢ ∃ x_1, x.IsAmalgamation x_1
state_after: no goals

tactic: intro y₁ y₂ hy₁ hy₂
state_before: case hunique
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
⊢ ∀ (y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }), x.IsAmalgamation y₁ → x.IsAmalgamation y₂ → y₁ = y₂
state_after: case hunique
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
⊢ y₁ = y₂

tactic: apply (Presieve.isSeparated_of_isSheaf _ _ G.cond _ (hF₂.cover_preserve hS)).ext
state_before: case hunique
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
⊢ y₁ = y₂
state_after: case hunique
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
⊢ ∀ ⦃Y : D⦄ ⦃f : Y ⟶ F.obj X⦄, (Sieve.functorPushforward F S).arrows f → G.val.map f.op y₁ = G.val.map f.op y₂

tactic: rintro Y _ ⟨Z, g, h, hg, rfl⟩
state_before: case hunique
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z : C
T : Presieve Z
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
⊢ ∀ ⦃Y : D⦄ ⦃f : Y ⟶ F.obj X⦄, (Sieve.functorPushforward F S).arrows f → G.val.map f.op y₁ = G.val.map f.op y₂
state_after: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
⊢ G.val.map (h ≫ F.map g).op y₁ = G.val.map (h ≫ F.map g).op y₂

tactic: dsimp
state_before: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
⊢ G.val.map (h ≫ F.map g).op y₁ = G.val.map (h ≫ F.map g).op y₂
state_after: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
⊢ G.val.map ((F.map g).op ≫ h.op) y₁ = G.val.map ((F.map g).op ≫ h.op) y₂

tactic: simp only [Functor.map_comp, types_comp_apply]
state_before: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
⊢ G.val.map ((F.map g).op ≫ h.op) y₁ = G.val.map ((F.map g).op ≫ h.op) y₂
state_after: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
⊢ G.val.map h.op (G.val.map (F.map g).op y₁) = G.val.map h.op (G.val.map (F.map g).op y₂)

tactic: have H := (hy₁ g hg).trans (hy₂ g hg).symm
state_before: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
⊢ G.val.map h.op (G.val.map (F.map g).op y₁) = G.val.map h.op (G.val.map (F.map g).op y₂)
state_after: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
H : (F.op ⋙ G.val).map g.op y₁ = (F.op ⋙ G.val).map g.op y₂
⊢ G.val.map h.op (G.val.map (F.map g).op y₁) = G.val.map h.op (G.val.map (F.map g).op y₂)

tactic: dsimp at H
state_before: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
H : (F.op ⋙ G.val).map g.op y₁ = (F.op ⋙ G.val).map g.op y₂
⊢ G.val.map h.op (G.val.map (F.map g).op y₁) = G.val.map h.op (G.val.map (F.map g).op y₂)
state_after: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
H : G.val.map (F.map g).op y₁ = G.val.map (F.map g).op y₂
⊢ G.val.map h.op (G.val.map (F.map g).op y₁) = G.val.map h.op (G.val.map (F.map g).op y₂)

tactic: rw [H]
state_before: case hunique.intro.intro.intro.intro
C : Type u₁
inst✝² : Category.{v₁, u₁} C
D : Type u₂
inst✝¹ : Category.{v₂, u₂} D
F : C ⥤ D
A : Type u₃
inst✝ : Category.{v₃, u₃} A
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology A
G✝ : C ⥤ D
hG : CompatiblePreserving K G✝
ℱ : SheafOfTypes K
Z✝ : C
T : Presieve Z✝
x✝ : FamilyOfElements (G✝.op ⋙ ℱ.val) T
h✝ : x✝.Compatible
hF₁ : CompatiblePreserving K F
hF₂ : CoverPreserving J K F
G : SheafOfTypes K
X : C
S : Sieve X
hS : S ∈ J.sieves X
x : FamilyOfElements (F.op ⋙ G.val) S.arrows
hx : x.Compatible
y₁ y₂ : (F.op ⋙ G.val).obj { unop := X }
hy₁ : x.IsAmalgamation y₁
hy₂ : x.IsAmalgamation y₂
Y : D
Z : C
g : Z ⟶ X
h : Y ⟶ F.obj Z
hg : S.arrows g
H : G.val.map (F.map g).op y₁ = G.val.map (F.map g).op y₂
⊢ G.val.map h.op (G.val.map (F.map g).op y₁) = G.val.map h.op (G.val.map (F.map g).op y₂)
state_after: no goals