-- Mathlib/CategoryTheory/Monoidal/Bimod.lean
theorem id_whiskerLeft_bimod {X Y : Mon_ C} {M N : Bimod X Y} (f : M ⟶ N) :
    whiskerLeft (regular X) f = (leftUnitorBimod M).hom ≫ f ≫ (leftUnitorBimod N).inv

Proof state:
case h.h
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
inst✝² : HasCoequalizers C
inst✝¹ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorLeft X)
inst✝ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorRight X)
X Y : Mon_ C
M N : Bimod X Y
f : M ⟶ N
⊢ X.X ◁ f.hom ≫
      colimit.ι (parallelPair (X.mul ▷ N.X) ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft)) WalkingParallelPair.one =
    (((X.X ◁ f.hom ≫ N.actLeft) ≫ (λ_ N.X).inv) ≫ X.one ▷ N.X) ≫
      coequalizer.π (X.mul ▷ N.X) ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft)

Tactic:
slice_rhs 2 3 => rw [leftUnitor_inv_naturality]

Result:
case h.h
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
inst✝² : HasCoequalizers C
inst✝¹ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorLeft X)
inst✝ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorRight X)
X Y : Mon_ C
M N : Bimod X Y
f : M ⟶ N
⊢ X.X ◁ f.hom ≫
      colimit.ι (parallelPair (X.mul ▷ N.X) ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft)) WalkingParallelPair.one =
    X.X ◁ f.hom ≫
      (((λ_ (X.X ⊗ N.X)).inv ≫ 𝟙_ C ◁ N.actLeft) ≫ X.one ▷ N.X) ≫
        coequalizer.π (X.mul ▷ N.X) ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft)

Proof state:
case h.h
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
inst✝² : HasCoequalizers C
inst✝¹ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorLeft X)
inst✝ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorRight X)
X Y : Mon_ C
M N : Bimod X Y
f : M ⟶ N
⊢ coequalizer.π
        ({ X := X.X, actLeft := X.mul, one_actLeft := ⋯, left_assoc := ⋯, actRight := X.mul, actRight_one := ⋯,
              right_assoc := ⋯, middle_assoc := ⋯ }.actRight ▷
          M.X)
        ((α_
              { X := X.X, actLeft := X.mul, one_actLeft := ⋯, left_assoc := ⋯, actRight := X.mul, actRight_one := ⋯,
                  right_assoc := ⋯, middle_assoc := ⋯ }.X
              X.X M.X).hom ≫
          { X := X.X, actLeft := X.mul, one_actLeft := ⋯, left_assoc := ⋯, actRight := X.mul, actRight_one := ⋯,
                right_assoc := ⋯, middle_assoc := ⋯ }.X ◁
            M.actLeft) ≫
      ({ X := X.X, actLeft := X.mul, one_actLeft := ⋯, left_assoc := ⋯, actRight := X.mul, actRight_one := ⋯,
              right_assoc := ⋯, middle_assoc := ⋯ }.whiskerLeft
          f).hom =
    coequalizer.π
        ({ X := X.X, actLeft := X.mul, one_actLeft := ⋯, left_assoc := ⋯, actRight := X.mul, actRight_one := ⋯,
              right_assoc := ⋯, middle_assoc := ⋯ }.actRight ▷
          M.X)
        ((α_
              { X := X.X, actLeft := X.mul, one_actLeft := ⋯, left_assoc := ⋯, actRight := X.mul, actRight_one := ⋯,
                  right_assoc := ⋯, middle_assoc := ⋯ }.X
              X.X M.X).hom ≫
          { X := X.X, actLeft := X.mul, one_actLeft := ⋯, left_assoc := ⋯, actRight := X.mul, actRight_one := ⋯,
                right_assoc := ⋯, middle_assoc := ⋯ }.X ◁
            M.actLeft) ≫
      ((isoOfIso { hom := LeftUnitorBimod.hom M, inv := LeftUnitorBimod.inv M, hom_inv_id := ⋯, inv_hom_id := ⋯ } ⋯
              ⋯).hom ≫
          f ≫
            (isoOfIso { hom := LeftUnitorBimod.hom N, inv := LeftUnitorBimod.inv N, hom_inv_id := ⋯, inv_hom_id := ⋯ } ⋯
                ⋯).inv).hom

Tactic:
dsimp

Result:
case h.h
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
inst✝² : HasCoequalizers C
inst✝¹ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorLeft X)
inst✝ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorRight X)
X Y : Mon_ C
M N : Bimod X Y
f : M ⟶ N
⊢ coequalizer.π (X.mul ▷ M.X) ((α_ X.X X.X M.X).hom ≫ X.X ◁ M.actLeft) ≫
      colimMap
        (parallelPairHom (X.mul ▷ M.X) ((α_ X.X X.X M.X).hom ≫ X.X ◁ M.actLeft) (X.mul ▷ N.X)
          ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft) ((X.X ⊗ X.X) ◁ f.hom) (X.X ◁ f.hom) ⋯ ⋯) =
    coequalizer.π (X.mul ▷ M.X) ((α_ X.X X.X M.X).hom ≫ X.X ◁ M.actLeft) ≫
      LeftUnitorBimod.hom M ≫ f.hom ≫ LeftUnitorBimod.inv N

Proof state:
case h.h
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
inst✝² : HasCoequalizers C
inst✝¹ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorLeft X)
inst✝ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorRight X)
X Y : Mon_ C
M N : Bimod X Y
f : M ⟶ N
⊢ coequalizer.π (X.mul ▷ M.X) ((α_ X.X X.X M.X).hom ≫ X.X ◁ M.actLeft) ≫
      colimMap
        (parallelPairHom (X.mul ▷ M.X) ((α_ X.X X.X M.X).hom ≫ X.X ◁ M.actLeft) (X.mul ▷ N.X)
          ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft) ((X.X ⊗ X.X) ◁ f.hom) (X.X ◁ f.hom) ⋯ ⋯) =
    coequalizer.π (X.mul ▷ M.X) ((α_ X.X X.X M.X).hom ≫ X.X ◁ M.actLeft) ≫
      LeftUnitorBimod.hom M ≫ f.hom ≫ LeftUnitorBimod.inv N

Tactic:
slice_lhs 1 2 => rw [ι_colimMap, parallelPairHom_app_one]

Result:
case h.h
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
inst✝² : HasCoequalizers C
inst✝¹ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorLeft X)
inst✝ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorRight X)
X Y : Mon_ C
M N : Bimod X Y
f : M ⟶ N
⊢ X.X ◁ f.hom ≫
      colimit.ι (parallelPair (X.mul ▷ N.X) ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft)) WalkingParallelPair.one =
    coequalizer.π (X.mul ▷ M.X) ((α_ X.X X.X M.X).hom ≫ X.X ◁ M.actLeft) ≫
      LeftUnitorBimod.hom M ≫ f.hom ≫ LeftUnitorBimod.inv N

Proof state:
case h.h
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
inst✝² : HasCoequalizers C
inst✝¹ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorLeft X)
inst✝ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorRight X)
X Y : Mon_ C
M N : Bimod X Y
f : M ⟶ N
⊢ X.X ◁ f.hom ≫
      colimit.ι (parallelPair (X.mul ▷ N.X) ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft)) WalkingParallelPair.one =
    X.X ◁ f.hom ≫
      (λ_ (X.X ⊗ N.X)).inv ≫
        (X.one ▷ (X.X ⊗ N.X) ≫ X.X ◁ N.actLeft) ≫ coequalizer.π (X.mul ▷ N.X) ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft)

Tactic:
slice_rhs 4 4 => rw [← Iso.inv_hom_id_assoc (α_ X.X X.X N.X) (X.X ◁ N.actLeft)]

Result:
case h.h
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
inst✝² : HasCoequalizers C
inst✝¹ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorLeft X)
inst✝ : ∀ (X : C), PreservesColimitsOfSize.{0, 0, v₁, v₁, u₁, u₁} (tensorRight X)
X Y : Mon_ C
M N : Bimod X Y
f : M ⟶ N
⊢ X.X ◁ f.hom ≫
      colimit.ι (parallelPair (X.mul ▷ N.X) ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft)) WalkingParallelPair.one =
    X.X ◁ f.hom ≫
      (λ_ (X.X ⊗ N.X)).inv ≫
        X.one ▷ (X.X ⊗ N.X) ≫
          ((α_ X.X X.X N.X).inv ≫ (α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft) ≫
            coequalizer.π (X.mul ▷ N.X) ((α_ X.X X.X N.X).hom ≫ X.X ◁ N.actLeft)