Theorem: CategoryTheory.Presheaf.compYonedaIsoYonedaCompLan.coconeApp_naturality
File: Mathlib/CategoryTheory/Limits/Presheaf.lean

Proof steps:
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
state_after: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
tactic: have eq₁ : yoneda.map f.1.unop ≫ yonedaEquiv.symm x.2 = yonedaEquiv.symm y.2 :=
    yonedaEquiv.injective
      (by simpa only [Equiv.apply_symm_apply, ← yonedaEquiv_naturality] using f.2)
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
state_after: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op ≫
        (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst))))
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst)))))) =
    ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst))) ≫
        (G.obj P).map (F.map (↑f).unop).op)
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst))))))
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
tactic: have eq₂ := congr_fun ((G.map (yonedaEquiv.symm x.2)).naturality (F.map f.1.unop).op)
    ((φ.app x.1.unop).app _ (𝟙 _))
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op ≫
        (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst))))
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst)))))) =
    ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst))) ≫
        (G.obj P).map (F.map (↑f).unop).op)
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst))))))
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
state_after: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op ≫
        (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst))))
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst)))))) =
    ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst))) ≫
        (G.obj P).map (F.map (↑f).unop).op)
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst))))))
eq₃ :
  ((F ⋙ yoneda).map (↑f).unop ≫ φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (Opposite.unop (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst))))) =
    (φ.app (Opposite.unop y.fst) ≫ (yoneda ⋙ G).map (↑f).unop).app
      (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (Opposite.unop (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))))
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
tactic: have eq₃ := congr_fun (congr_app (φ.naturality f.1.unop) _) (𝟙 _)
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op ≫
        (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst))))
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst)))))) =
    ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst))) ≫
        (G.obj P).map (F.map (↑f).unop).op)
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst))))))
eq₃ :
  ((F ⋙ yoneda).map (↑f).unop ≫ φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (Opposite.unop (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst))))) =
    (φ.app (Opposite.unop y.fst) ≫ (yoneda ⋙ G).map (↑f).unop).app
      (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (Opposite.unop (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))))
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
state_after: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op ≫
        (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst))))
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst)))))) =
    ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst))) ≫
        (G.obj P).map (F.map (↑f).unop).op)
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst))))))
eq₃ :
  ((F ⋙ yoneda).map (↑f).unop ≫ φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (Opposite.unop (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst))))) =
    (φ.app (Opposite.unop y.fst) ≫ (yoneda ⋙ G).map (↑f).unop).app
      (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (Opposite.unop (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))))
eq₄ :
  ∀ (a : ((F ⋙ yoneda).obj (Opposite.unop x.fst)).obj (Opposite.op (F.obj (Opposite.unop x.fst)))),
    (((F ⋙ yoneda).obj (Opposite.unop x.fst)).map (F.map (↑f).unop).op ≫
          (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))))
        a =
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) ≫
          ((yoneda ⋙ G).obj (Opposite.unop x.fst)).map (F.map (↑f).unop).op)
        a
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
tactic: have eq₄ := congr_fun ((φ.app x.1.unop).naturality (F.map f.1.unop).op)
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op ≫
        (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst))))
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst)))))) =
    ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst))) ≫
        (G.obj P).map (F.map (↑f).unop).op)
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        (𝟙 (Opposite.unop (Opposite.op (F.obj (Opposite.unop x.fst))))))
eq₃ :
  ((F ⋙ yoneda).map (↑f).unop ≫ φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (Opposite.unop (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst))))) =
    (φ.app (Opposite.unop y.fst) ≫ (yoneda ⋙ G).map (↑f).unop).app
      (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (Opposite.unop (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))))
eq₄ :
  ∀ (a : ((F ⋙ yoneda).obj (Opposite.unop x.fst)).obj (Opposite.op (F.obj (Opposite.unop x.fst)))),
    (((F ⋙ yoneda).obj (Opposite.unop x.fst)).map (F.map (↑f).unop).op ≫
          (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))))
        a =
      ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) ≫
          ((yoneda ⋙ G).obj (Opposite.unop x.fst)).map (F.map (↑f).unop).op)
        a
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
state_after: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst)))
      ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst))))) =
    (G.obj P).map (F.map (↑f).unop).op
      ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst)))))
eq₃ :
  (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst)) ≫ F.map (↑f).unop) =
    (G.map (yoneda.map (↑f).unop)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
        (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst))))
eq₄ :
  ∀ (a : F.obj (Opposite.unop x.fst) ⟶ F.obj (Opposite.unop x.fst)),
    (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))) (F.map (↑f).unop ≫ a) =
      (G.obj (yoneda.obj (Opposite.unop x.fst))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) a)
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
tactic: dsimp at eq₂ eq₃ eq₄
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst)))
      ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst))))) =
    (G.obj P).map (F.map (↑f).unop).op
      ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst)))))
eq₃ :
  (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst)) ≫ F.map (↑f).unop) =
    (G.map (yoneda.map (↑f).unop)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
        (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst))))
eq₄ :
  ∀ (a : F.obj (Opposite.unop x.fst) ⟶ F.obj (Opposite.unop x.fst)),
    (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))) (F.map (↑f).unop ≫ a) =
      (G.obj (yoneda.obj (Opposite.unop x.fst))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) a)
⊢ yoneda.map (↑f).unop ≫ coconeApp φ x = coconeApp φ y
state_after: case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst)))
      ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst))))) =
    (G.obj P).map (F.map (↑f).unop).op
      ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst)))))
eq₃ :
  (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst)) ≫ F.map (↑f).unop) =
    (G.map (yoneda.map (↑f).unop)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
        (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst))))
eq₄ :
  ∀ (a : F.obj (Opposite.unop x.fst) ⟶ F.obj (Opposite.unop x.fst)),
    (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))) (F.map (↑f).unop ≫ a) =
      (G.obj (yoneda.obj (Opposite.unop x.fst))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) a)
⊢ yonedaEquiv (yoneda.map (↑f).unop ≫ coconeApp φ x) = yonedaEquiv (coconeApp φ y)
tactic: apply yonedaEquiv.injective
state_before: case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst)))
      ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst))))) =
    (G.obj P).map (F.map (↑f).unop).op
      ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst)))))
eq₃ :
  (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst)) ≫ F.map (↑f).unop) =
    (G.map (yoneda.map (↑f).unop)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
        (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst))))
eq₄ :
  ∀ (a : F.obj (Opposite.unop x.fst) ⟶ F.obj (Opposite.unop x.fst)),
    (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))) (F.map (↑f).unop ≫ a) =
      (G.obj (yoneda.obj (Opposite.unop x.fst))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) a)
⊢ yonedaEquiv (yoneda.map (↑f).unop ≫ coconeApp φ x) = yonedaEquiv (coconeApp φ y)
state_after: case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst)))
      ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst))))) =
    (G.obj P).map (F.map (↑f).unop).op
      ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst)))))
eq₃ :
  (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst)) ≫ F.map (↑f).unop) =
    (G.map (yoneda.map (↑f).unop)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
        (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst))))
eq₄ :
  ∀ (a : F.obj (Opposite.unop x.fst) ⟶ F.obj (Opposite.unop x.fst)),
    (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))) (F.map (↑f).unop ≫ a) =
      (G.obj (yoneda.obj (Opposite.unop x.fst))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) a)
⊢ yonedaEquiv
      (yoneda.map (↑f).unop ≫
        yonedaEquiv.symm
          ((G.map (yonedaEquiv.symm x.snd)).app (F.op.obj (Opposite.op (Opposite.unop x.fst)))
            ((φ.app (Opposite.unop x.fst)).app (F.op.obj (Opposite.op (Opposite.unop x.fst)))
              (𝟙 (Opposite.unop (F.op.obj (Opposite.op (Opposite.unop x.fst)))))))) =
    yonedaEquiv
      (yonedaEquiv.symm
        ((G.map (yonedaEquiv.symm y.snd)).app (F.op.obj (Opposite.op (Opposite.unop y.fst)))
          ((φ.app (Opposite.unop y.fst)).app (F.op.obj (Opposite.op (Opposite.unop y.fst)))
            (𝟙 (Opposite.unop (F.op.obj (Opposite.op (Opposite.unop y.fst))))))))
tactic: dsimp only [coconeApp]
state_before: case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst)))
      ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst))))) =
    (G.obj P).map (F.map (↑f).unop).op
      ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst)))))
eq₃ :
  (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst)) ≫ F.map (↑f).unop) =
    (G.map (yoneda.map (↑f).unop)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
        (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst))))
eq₄ :
  ∀ (a : F.obj (Opposite.unop x.fst) ⟶ F.obj (Opposite.unop x.fst)),
    (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))) (F.map (↑f).unop ≫ a) =
      (G.obj (yoneda.obj (Opposite.unop x.fst))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) a)
⊢ yonedaEquiv
      (yoneda.map (↑f).unop ≫
        yonedaEquiv.symm
          ((G.map (yonedaEquiv.symm x.snd)).app (F.op.obj (Opposite.op (Opposite.unop x.fst)))
            ((φ.app (Opposite.unop x.fst)).app (F.op.obj (Opposite.op (Opposite.unop x.fst)))
              (𝟙 (Opposite.unop (F.op.obj (Opposite.op (Opposite.unop x.fst)))))))) =
    yonedaEquiv
      (yonedaEquiv.symm
        ((G.map (yonedaEquiv.symm y.snd)).app (F.op.obj (Opposite.op (Opposite.unop y.fst)))
          ((φ.app (Opposite.unop y.fst)).app (F.op.obj (Opposite.op (Opposite.unop y.fst)))
            (𝟙 (Opposite.unop (F.op.obj (Opposite.op (Opposite.unop y.fst))))))))
state_after: case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst)))
      ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst))))) =
    (G.obj P).map (F.map (↑f).unop).op
      ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst)))))
eq₃ :
  (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst)) ≫ F.map (↑f).unop) =
    (G.map (yoneda.map (↑f).unop)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
        (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst))))
eq₄ :
  ∀ (a : F.obj (Opposite.unop x.fst) ⟶ F.obj (Opposite.unop x.fst)),
    (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))) (F.map (↑f).unop ≫ a) =
      (G.obj (yoneda.obj (Opposite.unop x.fst))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) a)
⊢ (F.op ⋙ G.obj P).map (↑f).unop.op
      ((G.map (yonedaEquiv.symm x.snd)).app (F.op.obj (Opposite.op (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (F.op.obj (Opposite.op (Opposite.unop x.fst)))
          (𝟙 (Opposite.unop (F.op.obj (Opposite.op (Opposite.unop x.fst))))))) =
    (G.map (yonedaEquiv.symm y.snd)).app (F.op.obj (Opposite.op (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (F.op.obj (Opposite.op (Opposite.unop y.fst)))
        (𝟙 (Opposite.unop (F.op.obj (Opposite.op (Opposite.unop y.fst))))))
tactic: rw [Equiv.apply_symm_apply, ← yonedaEquiv_naturality, Equiv.apply_symm_apply]
state_before: case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
ℰ : Type u₂
inst✝³ : Category.{v₁, u₂} ℰ
A✝ A : C ⥤ ℰ
inst✝² : yoneda.HasPointwiseLeftKanExtension A
D : Type u₂
inst✝¹ : Category.{v₁, u₂} D
F : C ⥤ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ Type v₁), F.op.HasLeftKanExtension P
X : C
G : (Cᵒᵖ ⥤ Type v₁) ⥤ Dᵒᵖ ⥤ Type v₁
φ : F ⋙ yoneda ⟶ yoneda ⋙ G
P : Cᵒᵖ ⥤ Type v₁
x y : P.Elements
f : x ⟶ y
eq₁ : yoneda.map (↑f).unop ≫ yonedaEquiv.symm x.snd = yonedaEquiv.symm y.snd
eq₂ :
  (G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop y.fst)))
      ((G.obj (yoneda.obj (Opposite.unop x.1))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst))))) =
    (G.obj P).map (F.map (↑f).unop).op
      ((G.map (yonedaEquiv.symm x.snd)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst)))
          (𝟙 (F.obj (Opposite.unop x.fst)))))
eq₃ :
  (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst)) ≫ F.map (↑f).unop) =
    (G.map (yoneda.map (↑f).unop)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (Opposite.op (F.toPrefunctor.1 (Opposite.unop y.fst)))
        (𝟙 (F.toPrefunctor.1 (Opposite.unop y.fst))))
eq₄ :
  ∀ (a : F.obj (Opposite.unop x.fst) ⟶ F.obj (Opposite.unop x.fst)),
    (φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop y.fst))) (F.map (↑f).unop ≫ a) =
      (G.obj (yoneda.obj (Opposite.unop x.fst))).map (F.map (↑f).unop).op
        ((φ.app (Opposite.unop x.fst)).app (Opposite.op (F.obj (Opposite.unop x.fst))) a)
⊢ (F.op ⋙ G.obj P).map (↑f).unop.op
      ((G.map (yonedaEquiv.symm x.snd)).app (F.op.obj (Opposite.op (Opposite.unop x.fst)))
        ((φ.app (Opposite.unop x.fst)).app (F.op.obj (Opposite.op (Opposite.unop x.fst)))
          (𝟙 (Opposite.unop (F.op.obj (Opposite.op (Opposite.unop x.fst))))))) =
    (G.map (yonedaEquiv.symm y.snd)).app (F.op.obj (Opposite.op (Opposite.unop y.fst)))
      ((φ.app (Opposite.unop y.fst)).app (F.op.obj (Opposite.op (Opposite.unop y.fst)))
        (𝟙 (Opposite.unop (F.op.obj (Opposite.op (Opposite.unop y.fst))))))
state_after: no goals
tactic: simp [← eq₁, ← eq₂, ← eq₃, ← eq₄, Functor.map_comp, FunctorToTypes.comp, id_comp, comp_id]