l3lab/ntp-mathlib huggingface dataset:
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    Category.assoc]
  symm
  iterate 5
    trans
    

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

Next tactic:
rw [← Category.id_comp g, tensor_comp]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  

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

Next tactic:
rw [← Category.assoc]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  

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

Next tactic:
symm
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  

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

Next tactic:
iterate 2
    trans
    rw [← Category.assoc]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    

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

Next tactic:
trans
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    

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

Next tactic:
rw [← Category.assoc]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    

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

Next tactic:
trans
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    

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

Next tactic:
rw [← Category.assoc]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    Category.assoc]
  symm
  iterate 5
    trans
    rw [← Category.id_comp g, tensor_comp]
  rw [← Category.assoc]
  symm
  iterate 2
    trans
    rw [← Category.assoc]
  

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

Next tactic:
apply eq_whisker
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    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
  

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

Next tactic:
repeat'
    -- Porting note: why do we need to fill in the implicit `C` here, and below?
    rw [← @id_tensor_comp C]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    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✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ ((𝟙 Zᘁ ⊗ η_ X Xᘁ) ≫ (𝟙 Zᘁ ⊗ f ⊗ 𝟙 Xᘁ)) ≫ (𝟙 Zᘁ ⊗ g ⊗ 𝟙 Xᘁ) =
    (𝟙 Zᘁ ⊗ η_ Y Yᘁ) ≫
      (𝟙 Zᘁ ⊗
        (𝟙 Y ⊗ (ρ_ Yᘁ).inv) ≫
          (𝟙 Y ⊗ 𝟙 Yᘁ ⊗ η_ X Xᘁ) ≫
            (𝟙 Y ⊗ 𝟙 Yᘁ ⊗ f ⊗ 𝟙 Xᘁ) ≫ (𝟙 Y ⊗ (α_ Yᘁ Y Xᘁ).inv) ≫ (𝟙 Y ⊗ ε_ Y Yᘁ ⊗ 𝟙 Xᘁ) ≫ (g ⊗ (λ_ Xᘁ).hom))

Next tactic:
rw [← @id_tensor_comp C]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    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✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ (𝟙 Zᘁ ⊗ η_ X Xᘁ ≫ (f ⊗ 𝟙 Xᘁ)) ≫ (𝟙 Zᘁ ⊗ g ⊗ 𝟙 Xᘁ) =
    (𝟙 Zᘁ ⊗ η_ Y Yᘁ) ≫
      (𝟙 Zᘁ ⊗
        (𝟙 Y ⊗ (ρ_ Yᘁ).inv) ≫
          (𝟙 Y ⊗ 𝟙 Yᘁ ⊗ η_ X Xᘁ) ≫
            (𝟙 Y ⊗ 𝟙 Yᘁ ⊗ f ⊗ 𝟙 Xᘁ) ≫ (𝟙 Y ⊗ (α_ Yᘁ Y Xᘁ).inv) ≫ (𝟙 Y ⊗ ε_ Y Yᘁ ⊗ 𝟙 Xᘁ) ≫ (g ⊗ (λ_ Xᘁ).hom))

Next tactic:
rw [← @id_tensor_comp C]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    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✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ 𝟙 Zᘁ ⊗ (η_ X Xᘁ ≫ (f ⊗ 𝟙 Xᘁ)) ≫ (g ⊗ 𝟙 Xᘁ) =
    (𝟙 Zᘁ ⊗ η_ Y Yᘁ) ≫
      (𝟙 Zᘁ ⊗
        (𝟙 Y ⊗ (ρ_ Yᘁ).inv) ≫
          (𝟙 Y ⊗ 𝟙 Yᘁ ⊗ η_ X Xᘁ) ≫
            (𝟙 Y ⊗ 𝟙 Yᘁ ⊗ f ⊗ 𝟙 Xᘁ) ≫ (𝟙 Y ⊗ (α_ Yᘁ Y Xᘁ).inv) ≫ (𝟙 Y ⊗ ε_ Y Yᘁ ⊗ 𝟙 Xᘁ) ≫ (g ⊗ (λ_ Xᘁ).hom))

Next tactic:
rw [← @id_tensor_comp C]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    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✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
⊢ 𝟙 Zᘁ ⊗ (η_ X Xᘁ ≫ (f ⊗ 𝟙 Xᘁ)) ≫ (g ⊗ 𝟙 Xᘁ) =
    𝟙 Zᘁ ⊗
      η_ Y Yᘁ ≫
        (𝟙 Y ⊗ (ρ_ Yᘁ).inv) ≫
          (𝟙 Y ⊗ 𝟙 Yᘁ ⊗ η_ X Xᘁ) ≫
            (𝟙 Y ⊗ 𝟙 Yᘁ ⊗ f ⊗ 𝟙 Xᘁ) ≫ (𝟙 Y ⊗ (α_ Yᘁ Y Xᘁ).inv) ≫ (𝟙 Y ⊗ ε_ Y Yᘁ ⊗ 𝟙 Xᘁ) ≫ (g ⊗ (λ_ Xᘁ).hom)

Next tactic:
rw [← @id_tensor_comp C]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    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 [← @id_tensor_comp C]
  

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

Next tactic:
congr 1
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    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 [← @id_tensor_comp C]
  congr 1
  

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

Next tactic:
rw [← id_tensor_comp_tensor_id (λ_ (Xᘁ)).hom g, id_tensor_rightUnitor_inv, Category.assoc,
    Category.assoc, rightUnitor_inv_naturality_assoc, ← associator_naturality_assoc, tensor_id,
    tensor_id_comp_id_tensor_assoc, ← associator_naturality_assoc]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    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 [← @id_tensor_comp C]
  congr 1
  rw [← id_tensor_comp_tensor_id (λ_ (Xᘁ)).hom g, id_tensor_rightUnitor_inv, Category.assoc,
    Category.assoc, rightUnitor_inv_naturality_assoc, ← associator_naturality_assoc, tensor_id,
    tensor_id_comp_id_tensor_assoc, ← associator_naturality_assoc]
  

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

Next tactic:
slice_rhs 2 3 =>
    rw [← tensor_comp, tensor_id, Category.comp_id, ← Category.id_comp (η_ Y (Yᘁ)), tensor_comp]
/-- The composition of right adjoint mates is the adjoint mate of the composition. -/
@[reassoc]
theorem comp_rightAdjointMate {X Y Z : C} [HasRightDual X] [HasRightDual Y] [HasRightDual Z]
    {f : X ⟶ Y} {g : Y ⟶ Z} : (f ≫ g)ᘁ = gᘁ ≫ fᘁ := by
  rw [rightAdjointMate_comp]
  simp only [rightAdjointMate, comp_tensor_id, Iso.cancel_iso_inv_left, id_tensor_comp,
    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 [← @id_tensor_comp C]
  congr 1
  rw [← id_tensor_comp_tensor_id (λ_ (Xᘁ)).hom g, id_tensor_rightUnitor_inv, Category.assoc,
    Category.assoc, rightUnitor_inv_naturality_assoc, ← associator_naturality_assoc, tensor_id,
    tensor_id_comp_id_tensor_assoc, ← associator_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✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
| (η_ Y Yᘁ ⊗ η_ X Xᘁ) ≫ ((𝟙 Y ⊗ 𝟙 Yᘁ) ⊗ f ⊗ 𝟙 Xᘁ)
case a.a.a.a.a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
| (α_ Y Yᘁ (Y ⊗ Xᘁ)).hom
case a.a.a.a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
| 𝟙 Y ⊗ (α_ Yᘁ Y Xᘁ).inv
case a.a.a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
| 𝟙 Y ⊗ ε_ Y Yᘁ ⊗ 𝟙 Xᘁ
case a.a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
| 𝟙 Y ⊗ (λ_ Xᘁ).hom
case a.a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual Z
f : X ⟶ Y
g : Y ⟶ Z
| g ⊗ 𝟙 Xᘁ
case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
inst✝³ : MonoidalCategory C
X Y Z : C
inst✝² : HasRightDual X
inst✝¹ : HasRightDual Y
inst✝ : HasRightDual 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]