Theorem: CategoryTheory.Pi.comapComp_inv_app
File: Mathlib/CategoryTheory/Pi/Basic.lean

Proof steps:
state_before: I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
⊢ (comap C g ⋙ comap (C ∘ g) f).map f' ≫ (fun X b => 𝟙 (X (g (f b)))) Y =
    (fun X b => 𝟙 (X (g (f b)))) X ≫ (comap C (g ∘ f)).map f'
state_after: I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
⊢ (({ obj := fun f i => f (g i), map := fun {X Y} α i => α (g i), map_id := ⋯, map_comp := ⋯ } ⋙
            { obj := fun f_1 i => f_1 (f i), map := fun {X Y} α i => α (f i), map_id := ⋯, map_comp := ⋯ }).map
        f' ≫
      fun b => 𝟙 (Y (g (f b)))) =
    (fun b => 𝟙 (X (g (f b)))) ≫ fun i => f' (g (f i))
tactic: simp only [comap, Function.comp]
state_before: I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
⊢ (({ obj := fun f i => f (g i), map := fun {X Y} α i => α (g i), map_id := ⋯, map_comp := ⋯ } ⋙
            { obj := fun f_1 i => f_1 (f i), map := fun {X Y} α i => α (f i), map_id := ⋯, map_comp := ⋯ }).map
        f' ≫
      fun b => 𝟙 (Y (g (f b)))) =
    (fun b => 𝟙 (X (g (f b)))) ≫ fun i => f' (g (f i))
state_after: case h
I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
x✝ : K
⊢ (({ obj := fun f i => f (g i), map := fun {X Y} α i => α (g i), map_id := ⋯, map_comp := ⋯ } ⋙
              { obj := fun f_1 i => f_1 (f i), map := fun {X Y} α i => α (f i), map_id := ⋯, map_comp := ⋯ }).map
          f' ≫
        fun b => 𝟙 (Y (g (f b))))
      x✝ =
    ((fun b => 𝟙 (X (g (f b)))) ≫ fun i => f' (g (f i))) x✝
tactic: funext
state_before: case h
I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
x✝ : K
⊢ (({ obj := fun f i => f (g i), map := fun {X Y} α i => α (g i), map_id := ⋯, map_comp := ⋯ } ⋙
              { obj := fun f_1 i => f_1 (f i), map := fun {X Y} α i => α (f i), map_id := ⋯, map_comp := ⋯ }).map
          f' ≫
        fun b => 𝟙 (Y (g (f b))))
      x✝ =
    ((fun b => 𝟙 (X (g (f b)))) ≫ fun i => f' (g (f i))) x✝
state_after: no goals
tactic: simp
state_before: I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
⊢ (comap C (g ∘ f)).map f' ≫ (fun X b => 𝟙 (X (g (f b)))) Y =
    (fun X b => 𝟙 (X (g (f b)))) X ≫ (comap C g ⋙ comap (C ∘ g) f).map f'
state_after: I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
⊢ ((fun i => f' (g (f i))) ≫ fun b => 𝟙 (Y (g (f b)))) =
    (fun b => 𝟙 (X (g (f b)))) ≫
      ({ obj := fun f i => f (g i), map := fun {X Y} α i => α (g i), map_id := ⋯, map_comp := ⋯ } ⋙
            { obj := fun f_1 i => f_1 (f i), map := fun {X Y} α i => α (f i), map_id := ⋯, map_comp := ⋯ }).map
        f'
tactic: simp only [comap, Function.comp]
state_before: I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
⊢ ((fun i => f' (g (f i))) ≫ fun b => 𝟙 (Y (g (f b)))) =
    (fun b => 𝟙 (X (g (f b)))) ≫
      ({ obj := fun f i => f (g i), map := fun {X Y} α i => α (g i), map_id := ⋯, map_comp := ⋯ } ⋙
            { obj := fun f_1 i => f_1 (f i), map := fun {X Y} α i => α (f i), map_id := ⋯, map_comp := ⋯ }).map
        f'
state_after: case h
I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
x✝ : K
⊢ ((fun i => f' (g (f i))) ≫ fun b => 𝟙 (Y (g (f b)))) x✝ =
    ((fun b => 𝟙 (X (g (f b)))) ≫
        ({ obj := fun f i => f (g i), map := fun {X Y} α i => α (g i), map_id := ⋯, map_comp := ⋯ } ⋙
              { obj := fun f_1 i => f_1 (f i), map := fun {X Y} α i => α (f i), map_id := ⋯, map_comp := ⋯ }).map
          f')
      x✝
tactic: funext
state_before: case h
I : Type w₀
J✝ : Type w₁
C : I → Type u₁
inst✝ : (i : I) → Category.{v₁, u₁} (C i)
J : Type w₁
K : Type w₂
f : K → J
g : J → I
X Y : (i : I) → C i
f' : X ⟶ Y
x✝ : K
⊢ ((fun i => f' (g (f i))) ≫ fun b => 𝟙 (Y (g (f b)))) x✝ =
    ((fun b => 𝟙 (X (g (f b)))) ≫
        ({ obj := fun f i => f (g i), map := fun {X Y} α i => α (g i), map_id := ⋯, map_comp := ⋯ } ⋙
              { obj := fun f_1 i => f_1 (f i), map := fun {X Y} α i => α (f i), map_id := ⋯, map_comp := ⋯ }).map
          f')
      x✝
state_after: no goals
tactic: simp