l3lab/ntp-mathlib huggingface dataset:
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    

Proof state:
case w
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ (η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ⊗ 𝟙 ᘁZ) ≫ ((𝟙 ᘁX ⊗ g) ⊗ 𝟙 ᘁZ) =
    (η_ (ᘁY) Y ⊗ 𝟙 ᘁZ) ≫
      (((λ_ ᘁY).inv ⊗ 𝟙 Y) ≫
          ((η_ (ᘁX) X ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫
            (((𝟙 ᘁX ⊗ f) ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫ ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y) ≫ ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ g) ⊗
        𝟙 ᘁZ)

Next tactic:
rw [← @comp_tensor_id C]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    

Proof state:
case w
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ (η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f)) ≫ (𝟙 ᘁX ⊗ g) ⊗ 𝟙 ᘁZ =
    (η_ (ᘁY) Y ⊗ 𝟙 ᘁZ) ≫
      (((λ_ ᘁY).inv ⊗ 𝟙 Y) ≫
          ((η_ (ᘁX) X ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫
            (((𝟙 ᘁX ⊗ f) ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫ ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y) ≫ ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ g) ⊗
        𝟙 ᘁZ)

Next tactic:
rw [← @comp_tensor_id C]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    

Proof state:
case w
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ (η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f)) ≫ (𝟙 ᘁX ⊗ g) ⊗ 𝟙 ᘁZ =
    η_ (ᘁY) Y ≫
        ((λ_ ᘁY).inv ⊗ 𝟙 Y) ≫
          ((η_ (ᘁX) X ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫
            (((𝟙 ᘁX ⊗ f) ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫ ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y) ≫ ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ g) ⊗
      𝟙 ᘁZ

Next tactic:
rw [← @comp_tensor_id C]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  

Proof state:
case w
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ (η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f)) ≫ (𝟙 ᘁX ⊗ g) ⊗ 𝟙 ᘁZ =
    η_ (ᘁY) Y ≫
        ((λ_ ᘁY).inv ⊗ 𝟙 Y) ≫
          ((η_ (ᘁX) X ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫
            (((𝟙 ᘁX ⊗ f) ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫ ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y) ≫ ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ g) ⊗
      𝟙 ᘁZ

Next tactic:
congr 1
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ (η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f)) ≫ (𝟙 ᘁX ⊗ g) =
    η_ (ᘁY) Y ≫
      ((λ_ ᘁY).inv ⊗ 𝟙 Y) ≫
        ((η_ (ᘁX) X ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫
          (((𝟙 ᘁX ⊗ f) ⊗ 𝟙 ᘁY) ⊗ 𝟙 Y) ≫ ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y) ≫ ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ g)

Next tactic:
rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ≫ (𝟙 ᘁX ⊗ g) =
    (λ_ (𝟙_ C)).inv ≫
      (η_ (ᘁX) X ⊗ η_ (ᘁY) Y) ≫
        ((𝟙 ᘁX ⊗ f) ⊗ 𝟙 ᘁY ⊗ 𝟙 Y) ≫
          (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv ≫
            ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y) ≫ ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ 𝟙 Y) ≫ (𝟙 ᘁX ⊗ g)

Next tactic:
slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  slice_rhs 2 3 =>
    

Proof state:
case a.a.a.a.a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
| (η_ (ᘁX) X ⊗ η_ (ᘁY) Y) ≫ ((𝟙 ᘁX ⊗ f) ⊗ 𝟙 ᘁY ⊗ 𝟙 Y)
case a.a.a.a.a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
| (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv
case a.a.a.a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
| (α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y
case a.a.a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
| (𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y
case a.a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
| (ρ_ ᘁX).hom ⊗ 𝟙 Y
case a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
| 𝟙 ᘁX ⊗ g
case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
| (λ_ (𝟙_ C)).inv

Next tactic:
rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
  

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ≫ (𝟙 ᘁX ⊗ g) =
    (λ_ (𝟙_ C)).inv ≫
      ((((((η_ (ᘁX) X ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ f) ⊗ η_ (ᘁY) Y)) ≫ (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv) ≫
              ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y)) ≫
            ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y)) ≫
          ((ρ_ ᘁX).hom ⊗ 𝟙 Y)) ≫
        (𝟙 ᘁX ⊗ g)

Next tactic:
rw [← tensor_id_comp_id_tensor (η_ (ᘁY) Y), ← tensor_id]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
  rw [← tensor_id_comp_id_tensor (η_ (ᘁY) Y), ← tensor_id]
  

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ≫ (𝟙 ᘁX ⊗ g) =
    (λ_ (𝟙_ C)).inv ≫
      ((((((η_ (ᘁX) X ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ f) ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ 𝟙 Y) ⊗ η_ (ᘁY) Y)) ≫ (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv) ≫
              ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y)) ≫
            ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y)) ≫
          ((ρ_ ᘁX).hom ⊗ 𝟙 Y)) ≫
        (𝟙 ᘁX ⊗ g)

Next tactic:
repeat' rw [@Category.assoc C]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
  rw [← tensor_id_comp_id_tensor (η_ (ᘁY) Y), ← tensor_id]
  repeat' 

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ≫ (𝟙 ᘁX ⊗ g) =
    (λ_ (𝟙_ C)).inv ≫
      ((((((η_ (ᘁX) X ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ f) ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ 𝟙 Y) ⊗ η_ (ᘁY) Y)) ≫ (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv) ≫
              ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y)) ≫
            ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y)) ≫
          ((ρ_ ᘁX).hom ⊗ 𝟙 Y)) ≫
        (𝟙 ᘁX ⊗ g)

Next tactic:
rw [@Category.assoc C]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
  rw [← tensor_id_comp_id_tensor (η_ (ᘁY) Y), ← tensor_id]
  repeat' 

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ≫ (𝟙 ᘁX ⊗ g) =
    (λ_ (𝟙_ C)).inv ≫
      (((((η_ (ᘁX) X ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ f) ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ 𝟙 Y) ⊗ η_ (ᘁY) Y)) ≫ (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv) ≫
            ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y)) ≫
          ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y)) ≫
        ((ρ_ ᘁX).hom ⊗ 𝟙 Y) ≫ (𝟙 ᘁX ⊗ g)

Next tactic:
rw [@Category.assoc C]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
  rw [← tensor_id_comp_id_tensor (η_ (ᘁY) Y), ← tensor_id]
  repeat' 

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ≫ (𝟙 ᘁX ⊗ g) =
    (λ_ (𝟙_ C)).inv ≫
      ((((η_ (ᘁX) X ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ f) ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ 𝟙 Y) ⊗ η_ (ᘁY) Y)) ≫ (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv) ≫
          ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y)) ≫
        ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ 𝟙 Y) ≫ (𝟙 ᘁX ⊗ g)

Next tactic:
rw [@Category.assoc C]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
  rw [← tensor_id_comp_id_tensor (η_ (ᘁY) Y), ← tensor_id]
  repeat' 

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ≫ (𝟙 ᘁX ⊗ g) =
    (λ_ (𝟙_ C)).inv ≫
      (((η_ (ᘁX) X ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ f) ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ 𝟙 Y) ⊗ η_ (ᘁY) Y)) ≫ (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv) ≫
        ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y) ≫ ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ 𝟙 Y) ≫ (𝟙 ᘁX ⊗ g)

Next tactic:
rw [@Category.assoc C]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
  rw [← tensor_id_comp_id_tensor (η_ (ᘁY) Y), ← tensor_id]
  repeat' 

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ≫ (𝟙 ᘁX ⊗ g) =
    (λ_ (𝟙_ C)).inv ≫
      ((η_ (ᘁX) X ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ f) ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ 𝟙 Y) ⊗ η_ (ᘁY) Y)) ≫
        (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv ≫
          ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y) ≫ ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ 𝟙 Y) ≫ (𝟙 ᘁX ⊗ g)

Next tactic:
rw [@Category.assoc C]
/-- The composition of left adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_leftAdjointMate {X Y Z : C} [HasLeftDual X] [HasLeftDual Y] [HasLeftDual Z] {f : X ⟶ Y}
    {g : Y ⟶ Z} : (ᘁf ≫ g) = (ᘁg) ≫ ᘁf := by
  rw [leftAdjointMate_comp]
  simp only [leftAdjointMate, id_tensor_comp, Iso.cancel_iso_inv_left, comp_tensor_id,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  apply eq_whisker
  repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @comp_tensor_id C]
  congr 1
  rw [← tensor_id_comp_id_tensor g (ρ_ (ᘁX)).hom, leftUnitor_inv_tensor_id, Category.assoc,
    Category.assoc, leftUnitor_inv_naturality_assoc, ← associator_inv_naturality_assoc, tensor_id,
    id_tensor_comp_tensor_id_assoc, ← associator_inv_naturality_assoc]
  slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ (ᘁY) Y), tensor_comp]
  rw [← tensor_id_comp_id_tensor (η_ (ᘁY) Y), ← tensor_id]
  repeat' 

Proof state:
case w.e_f
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasLeftDual X
inst✝¹ : HasLeftDual Y
inst✝ : HasLeftDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ η_ (ᘁX) X ≫ (𝟙 ᘁX ⊗ f) ≫ (𝟙 ᘁX ⊗ g) =
    (λ_ (𝟙_ C)).inv ≫
      (η_ (ᘁX) X ⊗ 𝟙 (𝟙_ C)) ≫
        (((𝟙 ᘁX ⊗ f) ⊗ 𝟙 (𝟙_ C)) ≫ ((𝟙 ᘁX ⊗ 𝟙 Y) ⊗ η_ (ᘁY) Y)) ≫
          (α_ (ᘁX ⊗ Y) (ᘁY) Y).inv ≫
            ((α_ (ᘁX) Y ᘁY).hom ⊗ 𝟙 Y) ≫ ((𝟙 ᘁX ⊗ ε_ (ᘁY) Y) ⊗ 𝟙 Y) ≫ ((ρ_ ᘁX).hom ⊗ 𝟙 Y) ≫ (𝟙 ᘁX ⊗ g)

Next tactic:
rw [@Category.assoc C]