Theorem: CategoryTheory.Functor.IsCoverDense.sheafCoyonedaHom_app
File: Mathlib/CategoryTheory/Sites/DenseSubsite.lean

Proof steps:
state_before: C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
⊢ (coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).map f ≫ (fun X => presheafHom (homOver α (unop X))) Y =
    (fun X => presheafHom (homOver α (unop X))) X ≫ (coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ'.val).map f
state_after: case w.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).map f ≫ (fun X => presheafHom (homOver α (unop X))) Y).app
      U x =
    ((fun X => presheafHom (homOver α (unop X))) X ≫
          (coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ'.val).map f).app
      U x
tactic: ext U x
state_before: case w.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).map f ≫ (fun X => presheafHom (homOver α (unop X))) Y).app
      U x =
    ((fun X => presheafHom (homOver α (unop X))) X ≫
          (coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ'.val).map f).app
      U x
state_after: case w.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ appHom (homOver α (unop Y)) (unop U) (f.unop ≫ x) = f.unop ≫ appHom (homOver α (unop X)) (unop U) x
tactic: change
      appHom (homOver α (unop Y)) (unop U) (f.unop ≫ x) =
        f.unop ≫ appHom (homOver α (unop X)) (unop U) x
state_before: case w.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ appHom (homOver α (unop Y)) (unop U) (f.unop ≫ x) = f.unop ≫ appHom (homOver α (unop X)) (unop U) x
state_after: case w.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ f.unop ≫ appHom (homOver α (unop X)) (unop U) x = appHom (homOver α (unop Y)) (unop U) (f.unop ≫ x)
tactic: symm
state_before: case w.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ f.unop ≫ appHom (homOver α (unop X)) (unop U) x = appHom (homOver α (unop Y)) (unop U) (f.unop ≫ x)
state_after: case w.h.h.hT
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ Sieve.coverByImage G (unop U) ∈ K.sieves (unop U)

case w.h.h.hx
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ (pushforwardFamily (homOver α (unop Y)) (f.unop ≫ x)).Compatible

case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ (pushforwardFamily (homOver α (unop Y)) (f.unop ≫ x)).IsAmalgamation (f.unop ≫ appHom (homOver α (unop X)) (unop U) x)
tactic: apply sheaf_eq_amalgamation
state_before: case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
⊢ (pushforwardFamily (homOver α (unop Y)) (f.unop ≫ x)).IsAmalgamation (f.unop ≫ appHom (homOver α (unop X)) (unop U) x)
state_after: case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
⊢ (ℱ'.val ⋙ coyoneda.obj (op (unop Y))).map f'.op (f.unop ≫ appHom (homOver α (unop X)) (unop U) x) =
    pushforwardFamily (homOver α (unop Y)) (f.unop ≫ x) f' hf'
tactic: intro Y' f' hf'
state_before: case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
x : ((coyoneda ⋙ (whiskeringLeft Dᵒᵖ A (Type ?u.72492)).obj ℱ).obj X).obj U
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
⊢ (ℱ'.val ⋙ coyoneda.obj (op (unop Y))).map f'.op (f.unop ≫ appHom (homOver α (unop X)) (unop U) x) =
    pushforwardFamily (homOver α (unop Y)) (f.unop ≫ x) f' hf'
state_after: case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ (ℱ'.val ⋙ coyoneda.obj (op (unop Y))).map f'.op (f.unop ≫ appHom (homOver α (unop X)) (unop U) x) =
    pushforwardFamily (homOver α (unop Y)) (f.unop ≫ x) f' hf'
tactic: change unop X ⟶ ℱ.obj (op (unop _)) at x
state_before: case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ (ℱ'.val ⋙ coyoneda.obj (op (unop Y))).map f'.op (f.unop ≫ appHom (homOver α (unop X)) (unop U) x) =
    pushforwardFamily (homOver α (unop Y)) (f.unop ≫ x) f' hf'
state_after: case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ (f.unop ≫ appHom (homOver α (unop X)) (unop U) x) ≫ ℱ'.val.map f'.op =
    (((f.unop ≫ x) ≫ ℱ.map (Nonempty.some hf').map.op) ≫ α.app (op (Nonempty.some hf').1)) ≫
      ℱ'.val.map (Nonempty.some hf').lift.op
tactic: dsimp
state_before: case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ (f.unop ≫ appHom (homOver α (unop X)) (unop U) x) ≫ ℱ'.val.map f'.op =
    (((f.unop ≫ x) ≫ ℱ.map (Nonempty.some hf').map.op) ≫ α.app (op (Nonempty.some hf').1)) ≫
      ℱ'.val.map (Nonempty.some hf').lift.op
state_after: case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ f.unop ≫ appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map f'.op =
    f.unop ≫
      x ≫ ℱ.map (Nonempty.some hf').map.op ≫ α.app (op (Nonempty.some hf').1) ≫ ℱ'.val.map (Nonempty.some hf').lift.op
tactic: simp only [pushforwardFamily, Functor.comp_map, coyoneda_obj_map, homOver_app, Category.assoc]
state_before: case w.h.h.h
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ f.unop ≫ appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map f'.op =
    f.unop ≫
      x ≫ ℱ.map (Nonempty.some hf').map.op ≫ α.app (op (Nonempty.some hf').1) ≫ ℱ'.val.map (Nonempty.some hf').lift.op
state_after: case w.h.h.h.e_a
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map f'.op =
    x ≫ ℱ.map (Nonempty.some hf').map.op ≫ α.app (op (Nonempty.some hf').1) ≫ ℱ'.val.map (Nonempty.some hf').lift.op
tactic: congr 1
state_before: case w.h.h.h.e_a
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map f'.op =
    x ≫ ℱ.map (Nonempty.some hf').map.op ≫ α.app (op (Nonempty.some hf').1) ≫ ℱ'.val.map (Nonempty.some hf').lift.op
state_after: case w.h.h.h.e_a
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map ((Nonempty.some hf').lift ≫ (Nonempty.some hf').map).op =
    x ≫ ℱ.map (Nonempty.some hf').map.op ≫ α.app (op (Nonempty.some hf').1) ≫ ℱ'.val.map (Nonempty.some hf').lift.op
tactic: conv_lhs => rw [← hf'.some.fac]
state_before: case w.h.h.h.e_a
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map ((Nonempty.some hf').lift ≫ (Nonempty.some hf').map).op =
    x ≫ ℱ.map (Nonempty.some hf').map.op ≫ α.app (op (Nonempty.some hf').1) ≫ ℱ'.val.map (Nonempty.some hf').lift.op
state_after: case w.h.h.h.e_a
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ (appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map (Nonempty.some hf').map.op) ≫
      ℱ'.val.map (Nonempty.some hf').lift.op =
    ((x ≫ ℱ.map (Nonempty.some hf').map.op) ≫ α.app (op (Nonempty.some hf').1)) ≫ ℱ'.val.map (Nonempty.some hf').lift.op
tactic: simp only [← Category.assoc, op_comp, Functor.map_comp]
state_before: case w.h.h.h.e_a
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ (appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map (Nonempty.some hf').map.op) ≫
      ℱ'.val.map (Nonempty.some hf').lift.op =
    ((x ≫ ℱ.map (Nonempty.some hf').map.op) ≫ α.app (op (Nonempty.some hf').1)) ≫ ℱ'.val.map (Nonempty.some hf').lift.op
state_after: case w.h.h.h.e_a.e_a
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map (Nonempty.some hf').map.op =
    (x ≫ ℱ.map (Nonempty.some hf').map.op) ≫ α.app (op (Nonempty.some hf').1)
tactic: congr 1
state_before: case w.h.h.h.e_a.e_a
C : Type u_1
inst✝⁵ : Category.{?u.69351, u_1} C
D : Type u_2
inst✝⁴ : Category.{?u.69358, u_2} D
E : Type u_3
inst✝³ : Category.{?u.69365, u_3} E
J : GrothendieckTopology C
K : GrothendieckTopology D
L : GrothendieckTopology E
A : Type u_4
inst✝² : Category.{?u.72492, u_4} A
G : C ⥤ D
inst✝¹ : G.IsCoverDense K
inst✝ : G.IsLocallyFull K
ℱ : Dᵒᵖ ⥤ A
ℱ' : Sheaf K A
α : G.op ⋙ ℱ ⟶ G.op ⋙ ℱ'.val
X Y : Aᵒᵖ
f : X ⟶ Y
U : Dᵒᵖ
Y' : D
f' : Y' ⟶ unop U
hf' : (Sieve.coverByImage G (unop U)).arrows f'
x : unop X ⟶ ℱ.obj (op (unop U))
⊢ appHom (homOver α (unop X)) (unop U) x ≫ ℱ'.val.map (Nonempty.some hf').map.op =
    (x ≫ ℱ.map (Nonempty.some hf').map.op) ≫ α.app (op (Nonempty.some hf').1)
state_after: no goals
tactic: exact (appHom_restrict (homOver α (unop X)) hf'.some.map.op x).trans (by simp)