Theorem: CategoryTheory.ULift.equivalence_inverse
File: Mathlib/CategoryTheory/Category/ULift.lean

Proof steps:
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
X Y : ULift.{u₂, u₁} C
f : X ⟶ Y
⊢ (downFunctor ⋙ upFunctor).map f ≫ (fun X => 𝟙 ((downFunctor ⋙ upFunctor).obj X)) Y =
    (fun X => 𝟙 ((downFunctor ⋙ upFunctor).obj X)) X ≫ (𝟭 (ULift.{u₂, u₁} C)).map f
state_after: C : Type u₁
inst✝ : Category.{v₁, u₁} C
X Y : ULift.{u₂, u₁} C
f : X ⟶ Y
⊢ f ≫ 𝟙 Y = 𝟙 X ≫ f
tactic: change f ≫ 𝟙 _ = 𝟙 _ ≫ f
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
X Y : ULift.{u₂, u₁} C
f : X ⟶ Y
⊢ f ≫ 𝟙 Y = 𝟙 X ≫ f
state_after: no goals
tactic: simp
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
X Y : ULift.{u₂, u₁} C
f : X ⟶ Y
⊢ (𝟭 (ULift.{u₂, u₁} C)).map f ≫ (fun X => 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj X)) Y =
    (fun X => 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj X)) X ≫ (downFunctor ⋙ upFunctor).map f
state_after: C : Type u₁
inst✝ : Category.{v₁, u₁} C
X Y : ULift.{u₂, u₁} C
f : X ⟶ Y
⊢ f ≫ 𝟙 Y = 𝟙 X ≫ f
tactic: change f ≫ 𝟙 _ = 𝟙 _ ≫ f
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
X Y : ULift.{u₂, u₁} C
f : X ⟶ Y
⊢ f ≫ 𝟙 Y = 𝟙 X ≫ f
state_after: no goals
tactic: simp
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
⊢ { app := fun X => 𝟙 ((downFunctor ⋙ upFunctor).obj X), naturality := ⋯ } ≫
      { app := fun X => 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj X), naturality := ⋯ } =
    𝟙 (downFunctor ⋙ upFunctor)
state_after: case w.h
C : Type u₁
inst✝ : Category.{v₁, u₁} C
x✝ : ULift.{u₂, u₁} C
⊢ ({ app := fun X => 𝟙 ((downFunctor ⋙ upFunctor).obj X), naturality := ⋯ } ≫
          { app := fun X => 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj X), naturality := ⋯ }).app
      x✝ =
    (𝟙 (downFunctor ⋙ upFunctor)).app x✝
tactic: ext
state_before: case w.h
C : Type u₁
inst✝ : Category.{v₁, u₁} C
x✝ : ULift.{u₂, u₁} C
⊢ ({ app := fun X => 𝟙 ((downFunctor ⋙ upFunctor).obj X), naturality := ⋯ } ≫
          { app := fun X => 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj X), naturality := ⋯ }).app
      x✝ =
    (𝟙 (downFunctor ⋙ upFunctor)).app x✝
state_after: case w.h
C : Type u₁
inst✝ : Category.{v₁, u₁} C
x✝ : ULift.{u₂, u₁} C
⊢ 𝟙 ((downFunctor ⋙ upFunctor).obj x✝) ≫ 𝟙 ((downFunctor ⋙ upFunctor).obj x✝) = 𝟙 ((downFunctor ⋙ upFunctor).obj x✝)
tactic: change 𝟙 _ ≫ 𝟙 _ = 𝟙 _
state_before: case w.h
C : Type u₁
inst✝ : Category.{v₁, u₁} C
x✝ : ULift.{u₂, u₁} C
⊢ 𝟙 ((downFunctor ⋙ upFunctor).obj x✝) ≫ 𝟙 ((downFunctor ⋙ upFunctor).obj x✝) = 𝟙 ((downFunctor ⋙ upFunctor).obj x✝)
state_after: no goals
tactic: simp
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
⊢ { app := fun X => 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj X), naturality := ⋯ } ≫
      { app := fun X => 𝟙 ((downFunctor ⋙ upFunctor).obj X), naturality := ⋯ } =
    𝟙 (𝟭 (ULift.{u₂, u₁} C))
state_after: case w.h
C : Type u₁
inst✝ : Category.{v₁, u₁} C
x✝ : ULift.{u₂, u₁} C
⊢ ({ app := fun X => 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj X), naturality := ⋯ } ≫
          { app := fun X => 𝟙 ((downFunctor ⋙ upFunctor).obj X), naturality := ⋯ }).app
      x✝ =
    (𝟙 (𝟭 (ULift.{u₂, u₁} C))).app x✝
tactic: ext
state_before: case w.h
C : Type u₁
inst✝ : Category.{v₁, u₁} C
x✝ : ULift.{u₂, u₁} C
⊢ ({ app := fun X => 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj X), naturality := ⋯ } ≫
          { app := fun X => 𝟙 ((downFunctor ⋙ upFunctor).obj X), naturality := ⋯ }).app
      x✝ =
    (𝟙 (𝟭 (ULift.{u₂, u₁} C))).app x✝
state_after: case w.h
C : Type u₁
inst✝ : Category.{v₁, u₁} C
x✝ : ULift.{u₂, u₁} C
⊢ 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj x✝) ≫ 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj x✝) = 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj x✝)
tactic: change 𝟙 _ ≫ 𝟙 _ = 𝟙 _
state_before: case w.h
C : Type u₁
inst✝ : Category.{v₁, u₁} C
x✝ : ULift.{u₂, u₁} C
⊢ 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj x✝) ≫ 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj x✝) = 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj x✝)
state_after: no goals
tactic: simp
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
X : C
⊢ upFunctor.map ({ hom := 𝟙 (𝟭 C), inv := 𝟙 (upFunctor ⋙ downFunctor), hom_inv_id := ⋯, inv_hom_id := ⋯ }.hom.app X) ≫
      { hom := { app := fun X => 𝟙 ((downFunctor ⋙ upFunctor).obj X), naturality := ⋯ },
              inv := { app := fun X => 𝟙 ((𝟭 (ULift.{u₂, u₁} C)).obj X), naturality := ⋯ }, hom_inv_id := ⋯,
              inv_hom_id := ⋯ }.hom.app
        (upFunctor.obj X) =
    𝟙 (upFunctor.obj X)
state_after: C : Type u₁
inst✝ : Category.{v₁, u₁} C
X : C
⊢ 𝟙 X ≫ 𝟙 X = 𝟙 X
tactic: change 𝟙 X ≫ 𝟙 X = 𝟙 X
state_before: C : Type u₁
inst✝ : Category.{v₁, u₁} C
X : C
⊢ 𝟙 X ≫ 𝟙 X = 𝟙 X
state_after: no goals
tactic: simp