Theorem: CategoryTheory.Idempotents.KaroubiUniversal₁.counitIso_inv_app_app_f
File: Mathlib/CategoryTheory/Idempotents/FunctorExtension.lean

Proof steps:
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
P : Karoubi C
⊢ (G.map P.decompId_p).f =
    ((((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).obj G).obj P).p ≫
      (G.map P.decompId_p).f ≫ (((𝟭 (Karoubi C ⥤ Karoubi D)).obj G).obj P).p
state_after: no goals
tactic: simpa only [hom_ext_iff, G.map_comp, G.map_id] using
                    G.congr_map
                      (show P.decompId_p = (toKaroubi C).map P.p ≫ P.decompId_p ≫ 𝟙 _ by simp)
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
P Q : Karoubi C
f : P ⟶ Q
⊢ (((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).obj G).map f ≫
      (fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }) Q =
    (fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }) P ≫ ((𝟭 (Karoubi C ⥤ Karoubi D)).obj G).map f
state_after: no goals
tactic: simpa only [hom_ext_iff, G.map_comp]
                using (G.congr_map (decompId_p_naturality f)).symm
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
P : Karoubi C
⊢ (G.map P.decompId_i).f =
    (((𝟭 (Karoubi C ⥤ Karoubi D)).obj G).obj P).p ≫
      (G.map P.decompId_i).f ≫
        ((((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).obj G).obj P).p
state_after: no goals
tactic: simpa only [hom_ext_iff, G.map_comp, G.map_id] using
                    G.congr_map
                      (show P.decompId_i = 𝟙 _ ≫ P.decompId_i ≫ (toKaroubi C).map P.p by simp)
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
P Q : Karoubi C
f : P ⟶ Q
⊢ ((𝟭 (Karoubi C ⥤ Karoubi D)).obj G).map f ≫ (fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }) Q =
    (fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }) P ≫
      (((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).obj G).map f
state_after: no goals
tactic: simpa only [hom_ext_iff, G.map_comp] using G.congr_map (decompId_i_naturality f)
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
⊢ { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ } ≫
      { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ } =
    𝟙 (((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).obj G)
state_after: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
P : Karoubi C
⊢ (({ app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ } ≫
            { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ }).app
        P).f =
    ((𝟙 (((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).obj G)).app P).f
tactic: ext P
state_before: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
P : Karoubi C
⊢ (({ app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ } ≫
            { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ }).app
        P).f =
    ((𝟙 (((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).obj G)).app P).f
state_after: no goals
tactic: simpa only [hom_ext_iff, G.map_comp, G.map_id] using G.congr_map P.decomp_p.symm
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
⊢ { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ } ≫
      { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ } =
    𝟙 ((𝟭 (Karoubi C ⥤ Karoubi D)).obj G)
state_after: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
P : Karoubi C
⊢ (({ app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ } ≫
            { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ }).app
        P).f =
    ((𝟙 ((𝟭 (Karoubi C ⥤ Karoubi D)).obj G)).app P).f
tactic: ext P
state_before: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
G : Karoubi C ⥤ Karoubi D
P : Karoubi C
⊢ (({ app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ } ≫
            { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ }).app
        P).f =
    ((𝟙 ((𝟭 (Karoubi C ⥤ Karoubi D)).obj G)).app P).f
state_after: no goals
tactic: simpa only [hom_ext_iff, G.map_comp, G.map_id] using G.congr_map P.decompId.symm
state_before: C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
X Y : Karoubi C ⥤ Karoubi D
φ : X ⟶ Y
⊢ ((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).map φ ≫
      ((fun G =>
            { hom := { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ },
              inv := { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ }, hom_inv_id := ⋯,
              inv_hom_id := ⋯ })
          Y).hom =
    ((fun G =>
            { hom := { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ },
              inv := { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ }, hom_inv_id := ⋯,
              inv_hom_id := ⋯ })
          X).hom ≫
      (𝟭 (Karoubi C ⥤ Karoubi D)).map φ
state_after: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
X Y : Karoubi C ⥤ Karoubi D
φ : X ⟶ Y
P : Karoubi C
⊢ ((((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).map φ ≫
            ((fun G =>
                  { hom := { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ },
                    inv := { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ },
                    hom_inv_id := ⋯, inv_hom_id := ⋯ })
                Y).hom).app
        P).f =
    ((((fun G =>
                  { hom := { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ },
                    inv := { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ },
                    hom_inv_id := ⋯, inv_hom_id := ⋯ })
                X).hom ≫
            (𝟭 (Karoubi C ⥤ Karoubi D)).map φ).app
        P).f
tactic: ext P
state_before: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
X Y : Karoubi C ⥤ Karoubi D
φ : X ⟶ Y
P : Karoubi C
⊢ ((((whiskeringLeft C (Karoubi C) (Karoubi D)).obj (toKaroubi C) ⋙ functorExtension₁ C D).map φ ≫
            ((fun G =>
                  { hom := { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ },
                    inv := { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ },
                    hom_inv_id := ⋯, inv_hom_id := ⋯ })
                Y).hom).app
        P).f =
    ((((fun G =>
                  { hom := { app := fun P => { f := (G.map P.decompId_p).f, comm := ⋯ }, naturality := ⋯ },
                    inv := { app := fun P => { f := (G.map P.decompId_i).f, comm := ⋯ }, naturality := ⋯ },
                    hom_inv_id := ⋯, inv_hom_id := ⋯ })
                X).hom ≫
            (𝟭 (Karoubi C ⥤ Karoubi D)).map φ).app
        P).f
state_after: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
X Y : Karoubi C ⥤ Karoubi D
φ : X ⟶ Y
P : Karoubi C
⊢ ((X.map ((toKaroubi C).map P.p)).f ≫ (φ.app ((toKaroubi C).obj P.X)).f) ≫ (Y.map P.decompId_p).f =
    (X.map P.decompId_p).f ≫ (φ.app P).f
tactic: dsimp
state_before: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
X Y : Karoubi C ⥤ Karoubi D
φ : X ⟶ Y
P : Karoubi C
⊢ ((X.map ((toKaroubi C).map P.p)).f ≫ (φ.app ((toKaroubi C).obj P.X)).f) ≫ (Y.map P.decompId_p).f =
    (X.map P.decompId_p).f ≫ (φ.app P).f
state_after: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
X Y : Karoubi C ⥤ Karoubi D
φ : X ⟶ Y
P : Karoubi C
⊢ ((X.map (P.decompId_p ≫ P.decompId_i)).f ≫ (φ.app ((toKaroubi C).obj P.X)).f) ≫ (Y.map P.decompId_p).f =
    (X.map P.decompId_p).f ≫ (X.map P.decompId_i ≫ φ.app { X := P.X, p := 𝟙 P.X, idem := ⋯ } ≫ Y.map P.decompId_p).f
tactic: rw [natTrans_eq φ P, P.decomp_p]
state_before: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
X Y : Karoubi C ⥤ Karoubi D
φ : X ⟶ Y
P : Karoubi C
⊢ ((X.map (P.decompId_p ≫ P.decompId_i)).f ≫ (φ.app ((toKaroubi C).obj P.X)).f) ≫ (Y.map P.decompId_p).f =
    (X.map P.decompId_p).f ≫ (X.map P.decompId_i ≫ φ.app { X := P.X, p := 𝟙 P.X, idem := ⋯ } ≫ Y.map P.decompId_p).f
state_after: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
X Y : Karoubi C ⥤ Karoubi D
φ : X ⟶ Y
P : Karoubi C
⊢ (X.map P.decompId_p).f ≫ (X.map P.decompId_i).f ≫ (φ.app ((toKaroubi C).obj P.X)).f ≫ (Y.map P.decompId_p).f =
    (X.map P.decompId_p).f ≫
      (X.map P.decompId_i).f ≫ (φ.app { X := P.X, p := 𝟙 P.X, idem := ⋯ }).f ≫ (Y.map P.decompId_p).f
tactic: simp only [Functor.map_comp, comp_f, assoc]
state_before: case w.h.h
C : Type u_1
D : Type u_2
E : Type u_3
inst✝² : Category.{?u.48051, u_1} C
inst✝¹ : Category.{?u.48055, u_2} D
inst✝ : Category.{?u.48059, u_3} E
X Y : Karoubi C ⥤ Karoubi D
φ : X ⟶ Y
P : Karoubi C
⊢ (X.map P.decompId_p).f ≫ (X.map P.decompId_i).f ≫ (φ.app ((toKaroubi C).obj P.X)).f ≫ (Y.map P.decompId_p).f =
    (X.map P.decompId_p).f ≫
      (X.map P.decompId_i).f ≫ (φ.app { X := P.X, p := 𝟙 P.X, idem := ⋯ }).f ≫ (Y.map P.decompId_p).f
state_after: no goals
tactic: rfl