l3lab/ntp-mathlib huggingface dataset:
instance : MonoidalCategory (F C) where
  tensorObj X Y := FreeMonoidalCategory.tensor X Y
  tensorHom := @fun X₁ Y₁ X₂ Y₂ =>
    Quotient.map₂ Hom.tensor <| by
      intro _ _ h _ _ h'
      exact HomEquiv.tensor h h'
  whiskerLeft := fun X _ _ f =>
    Quotient.map (fun f' => Hom.tensor (Hom.id X) f')
      (fun _ _ h => HomEquiv.tensor (HomEquiv.refl (Hom.id X)) h) f
  whiskerRight := fun f Y =>
    Quotient.map (fun f' => Hom.tensor f' (Hom.id Y))
      (fun _ _ h => HomEquiv.tensor h (HomEquiv.refl (Hom.id Y))) f
  tensorHom_def := by
    rintro W X Y Z ⟨f⟩ ⟨g⟩
    apply Quotient.sound
    calc Hom.tensor f g
      _ ≈ Hom.tensor (Hom.comp f (Hom.id X)) (Hom.comp (Hom.id Y) g) := by
        apply HomEquiv.tensor (HomEquiv.comp_id f).symm (HomEquiv.id_comp g).symm
      _ ≈ Hom.comp (Hom.tensor f (Hom.id Y)) (Hom.tensor (Hom.id X) g) := by
        apply HomEquiv.tensor_comp
  whiskerLeft_id := by
    rintro X Y
    apply Quotient.sound
    apply HomEquiv.tensor_id
  id_whiskerRight := by
    intro X Y
    apply Quotient.sound
    apply HomEquiv.tensor_id
  tensor_id X Y := Quotient.sound tensor_id
  tensor_comp := @fun X₁ Y₁ Z₁ X₂ Y₂ Z₂ => by
    rintro ⟨f₁⟩ ⟨f₂⟩ ⟨g₁⟩ ⟨g₂⟩
    exact Quotient.sound (tensor_comp _ _ _ _)
  tensorUnit := FreeMonoidalCategory.unit
  associator X Y Z :=
    ⟨⟦Hom.α_hom X Y Z⟧, ⟦Hom.α_inv X Y Z⟧, Quotient.sound α_hom_inv, Quotient.sound α_inv_hom⟩
  associator_naturality := @fun X₁ X₂ X₃ Y₁ Y₂ Y₃ => by
    rintro ⟨f₁⟩ ⟨f₂⟩ ⟨f₃⟩
    exact Quotient.sound (associator_naturality _ _ _)
  leftUnitor X := ⟨⟦Hom.l_hom X⟧, ⟦Hom.l_inv X⟧, Quotient.sound l_hom_inv, Quotient.sound l_inv_hom⟩
  leftUnitor_naturality := @fun X Y => by
    rintro ⟨f⟩
    exact Quotient.sound (l_naturality _)
  rightUnitor X :=
    ⟨⟦Hom.ρ_hom X⟧, ⟦Hom.ρ_inv X⟧, Quotient.sound ρ_hom_inv, Quotient.sound ρ_inv_hom⟩
  rightUnitor_naturality := @fun X Y => by
    

Proof state:
C : Type u
X Y : F C
⊢ ∀ (f : X ⟶ Y), (f ⊗ 𝟙 (𝟙_ (F C))) ≫ (ρ_ Y).hom = (ρ_ X).hom ≫ f

Next tactic:
rintro ⟨f⟩
instance : MonoidalCategory (F C) where
  tensorObj X Y := FreeMonoidalCategory.tensor X Y
  tensorHom := @fun X₁ Y₁ X₂ Y₂ =>
    Quotient.map₂ Hom.tensor <| by
      intro _ _ h _ _ h'
      exact HomEquiv.tensor h h'
  whiskerLeft := fun X _ _ f =>
    Quotient.map (fun f' => Hom.tensor (Hom.id X) f')
      (fun _ _ h => HomEquiv.tensor (HomEquiv.refl (Hom.id X)) h) f
  whiskerRight := fun f Y =>
    Quotient.map (fun f' => Hom.tensor f' (Hom.id Y))
      (fun _ _ h => HomEquiv.tensor h (HomEquiv.refl (Hom.id Y))) f
  tensorHom_def := by
    rintro W X Y Z ⟨f⟩ ⟨g⟩
    apply Quotient.sound
    calc Hom.tensor f g
      _ ≈ Hom.tensor (Hom.comp f (Hom.id X)) (Hom.comp (Hom.id Y) g) := by
        apply HomEquiv.tensor (HomEquiv.comp_id f).symm (HomEquiv.id_comp g).symm
      _ ≈ Hom.comp (Hom.tensor f (Hom.id Y)) (Hom.tensor (Hom.id X) g) := by
        apply HomEquiv.tensor_comp
  whiskerLeft_id := by
    rintro X Y
    apply Quotient.sound
    apply HomEquiv.tensor_id
  id_whiskerRight := by
    intro X Y
    apply Quotient.sound
    apply HomEquiv.tensor_id
  tensor_id X Y := Quotient.sound tensor_id
  tensor_comp := @fun X₁ Y₁ Z₁ X₂ Y₂ Z₂ => by
    rintro ⟨f₁⟩ ⟨f₂⟩ ⟨g₁⟩ ⟨g₂⟩
    exact Quotient.sound (tensor_comp _ _ _ _)
  tensorUnit := FreeMonoidalCategory.unit
  associator X Y Z :=
    ⟨⟦Hom.α_hom X Y Z⟧, ⟦Hom.α_inv X Y Z⟧, Quotient.sound α_hom_inv, Quotient.sound α_inv_hom⟩
  associator_naturality := @fun X₁ X₂ X₃ Y₁ Y₂ Y₃ => by
    rintro ⟨f₁⟩ ⟨f₂⟩ ⟨f₃⟩
    exact Quotient.sound (associator_naturality _ _ _)
  leftUnitor X := ⟨⟦Hom.l_hom X⟧, ⟦Hom.l_inv X⟧, Quotient.sound l_hom_inv, Quotient.sound l_inv_hom⟩
  leftUnitor_naturality := @fun X Y => by
    rintro ⟨f⟩
    exact Quotient.sound (l_naturality _)
  rightUnitor X :=
    ⟨⟦Hom.ρ_hom X⟧, ⟦Hom.ρ_inv X⟧, Quotient.sound ρ_hom_inv, Quotient.sound ρ_inv_hom⟩
  rightUnitor_naturality := @fun X Y => by
    rintro ⟨f⟩
    

Proof state:
case mk
C : Type u
X Y : F C
f✝ : X ⟶ Y
f : X ⟶ᵐ Y
⊢ (Quot.mk Setoid.r f ⊗ 𝟙 (𝟙_ (F C))) ≫ (ρ_ Y).hom = (ρ_ X).hom ≫ Quot.mk Setoid.r f

Next tactic:
exact Quotient.sound (ρ_naturality _)
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    

Proof state:
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f : C → D
X Y : F C
⊢ ∀ (a b : X ⟶ᵐ Y), a ≈ b → projectMapAux f a = projectMapAux f b

Next tactic:
intro f g h
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    

Proof state:
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝ : C → D
X Y : F C
f g : X ⟶ᵐ Y
h : f ≈ g
⊢ projectMapAux f✝ f = projectMapAux f✝ g

Next tactic:
induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => dsimp only [projectMapAux]; rw [Category.comp_id]
    | id_comp => dsimp only [projectMapAux]; rw [Category.id_comp]
    | assoc => dsimp only [projectMapAux]; rw [Category.assoc]
    | tensor_id => dsimp only [projectMapAux]; rw [MonoidalCategory.tensor_id]; rfl
    | tensor_comp => dsimp only [projectMapAux]; rw [MonoidalCategory.tensor_comp]
    | α_hom_inv => dsimp only [projectMapAux]; rw [Iso.hom_inv_id]
    | α_inv_hom => dsimp only [projectMapAux]; rw [Iso.inv_hom_id]
    | associator_naturality =>
        dsimp only [projectMapAux]; rw [MonoidalCategory.associator_naturality]
    | ρ_hom_inv => dsimp only [projectMapAux]; rw [Iso.hom_inv_id]
    | ρ_inv_hom => dsimp only [projectMapAux]; rw [Iso.inv_hom_id]
    | ρ_naturality =>
        dsimp only [projectMapAux, projectObj]; rw [MonoidalCategory.rightUnitor_naturality]
    | l_hom_inv => dsimp only [projectMapAux]; rw [Iso.hom_inv_id]
    | l_inv_hom => dsimp only [projectMapAux]; rw [Iso.inv_hom_id]
    | l_naturality =>
        dsimp only [projectMapAux, projectObj]
        exact MonoidalCategory.leftUnitor_naturality _
    | pentagon =>
        dsimp only [projectMapAux]
        exact MonoidalCategory.pentagon _ _ _ _
    | triangle =>
        dsimp only [projectMapAux]
        exact MonoidalCategory.triangle _ _
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    

Proof state:
case refl
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ : X✝ ⟶ᵐ Y✝
⊢ projectMapAux f✝¹ f✝ = projectMapAux f✝¹ f✝

Next tactic:
| refl => rfl
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => 

Proof state:
case refl
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ : X✝ ⟶ᵐ Y✝
⊢ projectMapAux f✝¹ f✝ = projectMapAux f✝¹ f✝

Next tactic:
rfl
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    

Proof state:
case symm
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ g✝ : X✝ ⟶ᵐ Y✝
a✝ : HomEquiv f✝ g✝
hfg' : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ g✝
⊢ projectMapAux f✝¹ g✝ = projectMapAux f✝¹ f✝

Next tactic:
| symm _ _ _ hfg' => exact hfg'.symm
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => 

Proof state:
case symm
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ g✝ : X✝ ⟶ᵐ Y✝
a✝ : HomEquiv f✝ g✝
hfg' : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ g✝
⊢ projectMapAux f✝¹ g✝ = projectMapAux f✝¹ f✝

Next tactic:
exact hfg'.symm
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    

Proof state:
case trans
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ g✝ h✝ : X✝ ⟶ᵐ Y✝
a✝¹ : HomEquiv f✝ g✝
a✝ : HomEquiv g✝ h✝
hfg : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ g✝
hgh : projectMapAux f✝¹ g✝ = projectMapAux f✝¹ h✝
⊢ projectMapAux f✝¹ f✝ = projectMapAux f✝¹ h✝

Next tactic:
| trans _ _ hfg hgh => exact hfg.trans hgh
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => 

Proof state:
case trans
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ g✝ h✝ : X✝ ⟶ᵐ Y✝
a✝¹ : HomEquiv f✝ g✝
a✝ : HomEquiv g✝ h✝
hfg : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ g✝
hgh : projectMapAux f✝¹ g✝ = projectMapAux f✝¹ h✝
⊢ projectMapAux f✝¹ f✝ = projectMapAux f✝¹ h✝

Next tactic:
exact hfg.trans hgh
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    

Proof state:
case comp
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ Z✝ : F C
f✝ f'✝ : X✝ ⟶ᵐ Y✝
g✝ g'✝ : Y✝ ⟶ᵐ Z✝
a✝¹ : HomEquiv f✝ f'✝
a✝ : HomEquiv g✝ g'✝
hf : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ f'✝
hg : projectMapAux f✝¹ g✝ = projectMapAux f✝¹ g'✝
⊢ projectMapAux f✝¹ (Hom.comp f✝ g✝) = projectMapAux f✝¹ (Hom.comp f'✝ g'✝)

Next tactic:
| comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => 

Proof state:
case comp
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ Z✝ : F C
f✝ f'✝ : X✝ ⟶ᵐ Y✝
g✝ g'✝ : Y✝ ⟶ᵐ Z✝
a✝¹ : HomEquiv f✝ f'✝
a✝ : HomEquiv g✝ g'✝
hf : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ f'✝
hg : projectMapAux f✝¹ g✝ = projectMapAux f✝¹ g'✝
⊢ projectMapAux f✝¹ (Hom.comp f✝ g✝) = projectMapAux f✝¹ (Hom.comp f'✝ g'✝)

Next tactic:
dsimp only [projectMapAux]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; 

Proof state:
case comp
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ Z✝ : F C
f✝ f'✝ : X✝ ⟶ᵐ Y✝
g✝ g'✝ : Y✝ ⟶ᵐ Z✝
a✝¹ : HomEquiv f✝ f'✝
a✝ : HomEquiv g✝ g'✝
hf : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ f'✝
hg : projectMapAux f✝¹ g✝ = projectMapAux f✝¹ g'✝
⊢ projectMapAux f✝¹ f✝ ≫ projectMapAux f✝¹ g✝ = projectMapAux f✝¹ f'✝ ≫ projectMapAux f✝¹ g'✝

Next tactic:
rw [hf, hg]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    

Proof state:
case tensor
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
W✝ X✝ Y✝ Z✝ : F C
f✝ f'✝ : W✝ ⟶ᵐ X✝
g✝ g'✝ : Y✝ ⟶ᵐ Z✝
a✝¹ : HomEquiv f✝ f'✝
a✝ : HomEquiv g✝ g'✝
hfg : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ f'✝
hfg' : projectMapAux f✝¹ g✝ = projectMapAux f✝¹ g'✝
⊢ projectMapAux f✝¹ (Hom.tensor f✝ g✝) = projectMapAux f✝¹ (Hom.tensor f'✝ g'✝)

Next tactic:
| tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => 

Proof state:
case tensor
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
W✝ X✝ Y✝ Z✝ : F C
f✝ f'✝ : W✝ ⟶ᵐ X✝
g✝ g'✝ : Y✝ ⟶ᵐ Z✝
a✝¹ : HomEquiv f✝ f'✝
a✝ : HomEquiv g✝ g'✝
hfg : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ f'✝
hfg' : projectMapAux f✝¹ g✝ = projectMapAux f✝¹ g'✝
⊢ projectMapAux f✝¹ (Hom.tensor f✝ g✝) = projectMapAux f✝¹ (Hom.tensor f'✝ g'✝)

Next tactic:
dsimp only [projectMapAux]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; 

Proof state:
case tensor
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
W✝ X✝ Y✝ Z✝ : F C
f✝ f'✝ : W✝ ⟶ᵐ X✝
g✝ g'✝ : Y✝ ⟶ᵐ Z✝
a✝¹ : HomEquiv f✝ f'✝
a✝ : HomEquiv g✝ g'✝
hfg : projectMapAux f✝¹ f✝ = projectMapAux f✝¹ f'✝
hfg' : projectMapAux f✝¹ g✝ = projectMapAux f✝¹ g'✝
⊢ projectMapAux f✝¹ f✝ ⊗ projectMapAux f✝¹ g✝ = projectMapAux f✝¹ f'✝ ⊗ projectMapAux f✝¹ g'✝

Next tactic:
rw [hfg, hfg']
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    

Proof state:
case comp_id
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ : X✝ ⟶ᵐ Y✝
⊢ projectMapAux f✝¹ (Hom.comp f✝ (Hom.id Y✝)) = projectMapAux f✝¹ f✝

Next tactic:
| comp_id => dsimp only [projectMapAux]; rw [Category.comp_id]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => 

Proof state:
case comp_id
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ : X✝ ⟶ᵐ Y✝
⊢ projectMapAux f✝¹ (Hom.comp f✝ (Hom.id Y✝)) = projectMapAux f✝¹ f✝

Next tactic:
dsimp only [projectMapAux]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => dsimp only [projectMapAux]; 

Proof state:
case comp_id
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ : X✝ ⟶ᵐ Y✝
⊢ projectMapAux f✝¹ f✝ ≫ 𝟙 (projectObj f✝¹ Y✝) = projectMapAux f✝¹ f✝

Next tactic:
rw [Category.comp_id]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => dsimp only [projectMapAux]; rw [Category.comp_id]
    

Proof state:
case id_comp
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ : X✝ ⟶ᵐ Y✝
⊢ projectMapAux f✝¹ (Hom.comp (Hom.id X✝) f✝) = projectMapAux f✝¹ f✝

Next tactic:
| id_comp => dsimp only [projectMapAux]; rw [Category.id_comp]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => dsimp only [projectMapAux]; rw [Category.comp_id]
    | id_comp => 

Proof state:
case id_comp
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ : X✝ ⟶ᵐ Y✝
⊢ projectMapAux f✝¹ (Hom.comp (Hom.id X✝) f✝) = projectMapAux f✝¹ f✝

Next tactic:
dsimp only [projectMapAux]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => dsimp only [projectMapAux]; rw [Category.comp_id]
    | id_comp => dsimp only [projectMapAux]; 

Proof state:
case id_comp
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
f✝ : X✝ ⟶ᵐ Y✝
⊢ 𝟙 (projectObj f✝¹ X✝) ≫ projectMapAux f✝¹ f✝ = projectMapAux f✝¹ f✝

Next tactic:
rw [Category.id_comp]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => dsimp only [projectMapAux]; rw [Category.comp_id]
    | id_comp => dsimp only [projectMapAux]; rw [Category.id_comp]
    

Proof state:
case assoc
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ U✝ V✝ : F C
f✝ : X✝ ⟶ᵐ U✝
g✝ : U✝ ⟶ᵐ V✝
h✝ : V✝ ⟶ᵐ Y✝
⊢ projectMapAux f✝¹ (Hom.comp (Hom.comp f✝ g✝) h✝) = projectMapAux f✝¹ (Hom.comp f✝ (Hom.comp g✝ h✝))

Next tactic:
| assoc => dsimp only [projectMapAux]; rw [Category.assoc]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => dsimp only [projectMapAux]; rw [Category.comp_id]
    | id_comp => dsimp only [projectMapAux]; rw [Category.id_comp]
    | assoc => 

Proof state:
case assoc
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ U✝ V✝ : F C
f✝ : X✝ ⟶ᵐ U✝
g✝ : U✝ ⟶ᵐ V✝
h✝ : V✝ ⟶ᵐ Y✝
⊢ projectMapAux f✝¹ (Hom.comp (Hom.comp f✝ g✝) h✝) = projectMapAux f✝¹ (Hom.comp f✝ (Hom.comp g✝ h✝))

Next tactic:
dsimp only [projectMapAux]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => dsimp only [projectMapAux]; rw [Category.comp_id]
    | id_comp => dsimp only [projectMapAux]; rw [Category.id_comp]
    | assoc => dsimp only [projectMapAux]; 

Proof state:
case assoc
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝¹ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ U✝ V✝ : F C
f✝ : X✝ ⟶ᵐ U✝
g✝ : U✝ ⟶ᵐ V✝
h✝ : V✝ ⟶ᵐ Y✝
⊢ (projectMapAux f✝¹ f✝ ≫ projectMapAux f✝¹ g✝) ≫ projectMapAux f✝¹ h✝ =
    projectMapAux f✝¹ f✝ ≫ projectMapAux f✝¹ g✝ ≫ projectMapAux f✝¹ h✝

Next tactic:
rw [Category.assoc]
/-- Auxiliary definition for `FreeMonoidalCategory.project`. -/
def projectMap (X Y : F C) : (X ⟶ Y) → (projectObj f X ⟶ projectObj f Y) :=
  Quotient.lift (projectMapAux f) <| by
    intro f g h
    induction h with
    | refl => rfl
    | symm _ _ _ hfg' => exact hfg'.symm
    | trans _ _ hfg hgh => exact hfg.trans hgh
    | comp _ _ hf hg => dsimp only [projectMapAux]; rw [hf, hg]
    | tensor _ _ hfg hfg' => dsimp only [projectMapAux]; rw [hfg, hfg']
    | comp_id => dsimp only [projectMapAux]; rw [Category.comp_id]
    | id_comp => dsimp only [projectMapAux]; rw [Category.id_comp]
    | assoc => dsimp only [projectMapAux]; rw [Category.assoc]
    

Proof state:
case tensor_id
C : Type u
D : Type u'
inst✝¹ : Category.{v', u'} D
inst✝ : MonoidalCategory D
f✝ : C → D
X Y : F C
f g : X ⟶ᵐ Y
X✝ Y✝ : F C
⊢ projectMapAux f✝ (Hom.tensor (Hom.id X✝) (Hom.id Y✝)) = projectMapAux f✝ (Hom.id (tensor X✝ Y✝))

Next tactic:
| tensor_id => dsimp only [projectMapAux]; rw [MonoidalCategory.tensor_id]; rfl