File: Mathlib/Tactic/CategoryTheory/Monoidal.lean

full_name: Mathlib.Tactic.Monoidal.Context.C
code: /-- The context for evaluating expressions. -/
structure Context where
  /-- The expression for the underlying category. -/
  C : Expr
goal: Lean.Expr

full_name: Mathlib.Tactic.Monoidal.Context
code: /-- The context for evaluating expressions. -/
structure Context where
  /-- The expression for the underlying category. -/
  C : Expr
goal: Type

full_name: Mathlib.Tactic.Monoidal.mkContext?
code: /-- Populate a `context` object for evaluating `e`. -/
def mkContext? (e : Expr) : MetaM (Option Context) 
goal: Lean.MetaM (Option Mathlib.Tactic.Monoidal.Context)

full_name: Mathlib.Tactic.Monoidal.MonoidalM
code: /-- The monad for the normalization of 2-morphisms. -/
abbrev MonoidalM 
goal: Type

full_name: Mathlib.Tactic.Monoidal.MonoidalM.run
code: /-- Run a computation in the `M` monad. -/
abbrev MonoidalM.run {α : Type} (c : Context) (m : MonoidalM α) : MetaM α 
goal: Lean.MetaM α

full_name: Mathlib.Tactic.Monoidal.Atom₁
code: /-- Expressions for atomic 1-morphisms. -/
structure Atom₁ : Type where
  /-- Extract a Lean expression from an `Atom₁` expression. -/
  e : Expr
goal: Type

full_name: Mathlib.Tactic.Monoidal.Atom₁.e
code: /-- Expressions for atomic 1-morphisms. -/
structure Atom₁ : Type where
  /-- Extract a Lean expression from an `Atom₁` expression. -/
  e : Expr
goal: Lean.Expr

full_name: Mathlib.Tactic.Monoidal.Mor₁
code: /-- Expressions for 1-morphisms. -/
inductive Mor₁ : Type
  /-- `id` is the expression for `𝟙_ C`. -/
  | id : Mor₁
  /-- `comp X Y` is the expression for `X ⊗ Y` -/
  | comp : Mor₁ → Mor₁ → Mor₁
  /-- Construct the expression for an atomic 1-morphism. -/
  | of : Atom₁ → Mor₁
  deriving Inhabited
goal: Type

full_name: Mathlib.Tactic.Monoidal.instInhabitedMor₁
code: /-- Expressions for 1-morphisms. -/
inductive Mor₁ : Type
  /-- `id` is the expression for `𝟙_ C`. -/
  | id : Mor₁
  /-- `comp X Y` is the expression for `X ⊗ Y` -/
  | comp : Mor₁ → Mor₁ → Mor₁
  /-- Construct the expression for an atomic 1-morphism. -/
  | of : Atom₁ → Mor₁
  deriving Inhabited
goal: Inhabited Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.Mor₁.id
code: /-- Expressions for 1-morphisms. -/
inductive Mor₁ : Type
  /-- `id` is the expression for `𝟙_ C`. -/
  | id : Mor₁
  /-- `comp X Y` is the expression for `X ⊗ Y` -/
  | comp : Mor₁ → Mor₁ → Mor₁
  /-- Construct the expression for an atomic 1-morphism. -/
  | of : Atom₁ → Mor₁
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.Mor₁.comp
code: /-- Expressions for 1-morphisms. -/
inductive Mor₁ : Type
  /-- `id` is the expression for `𝟙_ C`. -/
  | id : Mor₁
  /-- `comp X Y` is the expression for `X ⊗ Y` -/
  | comp : Mor₁ → Mor₁ → Mor₁
  /-- Construct the expression for an atomic 1-morphism. -/
  | of : Atom₁ → Mor₁
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.Mor₁ → Mathlib.Tactic.Monoidal.Mor₁ → Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.Mor₁.of
code: /-- Expressions for 1-morphisms. -/
inductive Mor₁ : Type
  /-- `id` is the expression for `𝟙_ C`. -/
  | id : Mor₁
  /-- `comp X Y` is the expression for `X ⊗ Y` -/
  | comp : Mor₁ → Mor₁ → Mor₁
  /-- Construct the expression for an atomic 1-morphism. -/
  | of : Atom₁ → Mor₁
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.Atom₁ → Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.Mor₁.toList
code: /-- Converts a 1-morphism into a list of its components. -/
def Mor₁.toList : Mor₁ → List Atom₁
  
goal: Mathlib.Tactic.Monoidal.Mor₁ → List Mathlib.Tactic.Monoidal.Atom₁

full_name: Mathlib.Tactic.Monoidal.isTensorUnit?
code: /-- Returns `𝟙_ C` if the expression `e` is of the form `𝟙_ C`. -/
def isTensorUnit? (e : Expr) : MetaM (Option Expr) 
goal: Lean.MetaM (Option Lean.Expr)

full_name: Mathlib.Tactic.Monoidal.isTensorObj?
code: /-- Returns `(f, g)` if the expression `e` is of the form `f ⊗ g`. -/
def isTensorObj? (e : Expr) : MetaM (Option (Expr × Expr)) 
goal: Lean.MetaM (Option (Lean.Expr × Lean.Expr))

full_name: Mathlib.Tactic.Monoidal.toMor₁
code: /-- Construct a `Mor₁` expression from a Lean expression. -/
partial def toMor₁ (e : Expr) : MetaM Mor₁ 
goal: Lean.MetaM Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.instInhabitedStructuralAtom
code: /-- Expressions for atomic structural 2-morphisms. -/
inductive StructuralAtom : Type
  /-- The expression for the associator `(α_ f g h).hom`. -/
  | associator (f g h : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the associator `(α_ f g h).inv`. -/
  | associatorInv (f g h : Mor₁) : StructuralAtom
  /-- The expression for the left unitor `(λ_ f).hom`. -/
  | leftUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the left unitor `(λ_ f).inv`. -/
  | leftUnitorInv (f : Mor₁) : StructuralAtom
  /-- The expression for the right unitor `(ρ_ f).hom`. -/
  | rightUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the right unitor `(ρ_ f).inv`. -/
  | rightUnitorInv (f : Mor₁) : StructuralAtom
  deriving Inhabited
goal: Inhabited Mathlib.Tactic.Monoidal.StructuralAtom

full_name: Mathlib.Tactic.Monoidal.StructuralAtom.rightUnitor
code: /-- Expressions for atomic structural 2-morphisms. -/
inductive StructuralAtom : Type
  /-- The expression for the associator `(α_ f g h).hom`. -/
  | associator (f g h : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the associator `(α_ f g h).inv`. -/
  | associatorInv (f g h : Mor₁) : StructuralAtom
  /-- The expression for the left unitor `(λ_ f).hom`. -/
  | leftUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the left unitor `(λ_ f).inv`. -/
  | leftUnitorInv (f : Mor₁) : StructuralAtom
  /-- The expression for the right unitor `(ρ_ f).hom`. -/
  | rightUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the right unitor `(ρ_ f).inv`. -/
  | rightUnitorInv (f : Mor₁) : StructuralAtom
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.StructuralAtom

full_name: Mathlib.Tactic.Monoidal.StructuralAtom.associatorInv
code: /-- Expressions for atomic structural 2-morphisms. -/
inductive StructuralAtom : Type
  /-- The expression for the associator `(α_ f g h).hom`. -/
  | associator (f g h : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the associator `(α_ f g h).inv`. -/
  | associatorInv (f g h : Mor₁) : StructuralAtom
  /-- The expression for the left unitor `(λ_ f).hom`. -/
  | leftUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the left unitor `(λ_ f).inv`. -/
  | leftUnitorInv (f : Mor₁) : StructuralAtom
  /-- The expression for the right unitor `(ρ_ f).hom`. -/
  | rightUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the right unitor `(ρ_ f).inv`. -/
  | rightUnitorInv (f : Mor₁) : StructuralAtom
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.StructuralAtom

full_name: Mathlib.Tactic.Monoidal.StructuralAtom.leftUnitorInv
code: /-- Expressions for atomic structural 2-morphisms. -/
inductive StructuralAtom : Type
  /-- The expression for the associator `(α_ f g h).hom`. -/
  | associator (f g h : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the associator `(α_ f g h).inv`. -/
  | associatorInv (f g h : Mor₁) : StructuralAtom
  /-- The expression for the left unitor `(λ_ f).hom`. -/
  | leftUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the left unitor `(λ_ f).inv`. -/
  | leftUnitorInv (f : Mor₁) : StructuralAtom
  /-- The expression for the right unitor `(ρ_ f).hom`. -/
  | rightUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the right unitor `(ρ_ f).inv`. -/
  | rightUnitorInv (f : Mor₁) : StructuralAtom
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.StructuralAtom

full_name: Mathlib.Tactic.Monoidal.StructuralAtom.associator
code: /-- Expressions for atomic structural 2-morphisms. -/
inductive StructuralAtom : Type
  /-- The expression for the associator `(α_ f g h).hom`. -/
  | associator (f g h : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the associator `(α_ f g h).inv`. -/
  | associatorInv (f g h : Mor₁) : StructuralAtom
  /-- The expression for the left unitor `(λ_ f).hom`. -/
  | leftUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the left unitor `(λ_ f).inv`. -/
  | leftUnitorInv (f : Mor₁) : StructuralAtom
  /-- The expression for the right unitor `(ρ_ f).hom`. -/
  | rightUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the right unitor `(ρ_ f).inv`. -/
  | rightUnitorInv (f : Mor₁) : StructuralAtom
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.StructuralAtom

full_name: Mathlib.Tactic.Monoidal.StructuralAtom
code: /-- Expressions for atomic structural 2-morphisms. -/
inductive StructuralAtom : Type
  /-- The expression for the associator `(α_ f g h).hom`. -/
  | associator (f g h : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the associator `(α_ f g h).inv`. -/
  | associatorInv (f g h : Mor₁) : StructuralAtom
  /-- The expression for the left unitor `(λ_ f).hom`. -/
  | leftUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the left unitor `(λ_ f).inv`. -/
  | leftUnitorInv (f : Mor₁) : StructuralAtom
  /-- The expression for the right unitor `(ρ_ f).hom`. -/
  | rightUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the right unitor `(ρ_ f).inv`. -/
  | rightUnitorInv (f : Mor₁) : StructuralAtom
  deriving Inhabited
goal: Type

full_name: Mathlib.Tactic.Monoidal.StructuralAtom.leftUnitor
code: /-- Expressions for atomic structural 2-morphisms. -/
inductive StructuralAtom : Type
  /-- The expression for the associator `(α_ f g h).hom`. -/
  | associator (f g h : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the associator `(α_ f g h).inv`. -/
  | associatorInv (f g h : Mor₁) : StructuralAtom
  /-- The expression for the left unitor `(λ_ f).hom`. -/
  | leftUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the left unitor `(λ_ f).inv`. -/
  | leftUnitorInv (f : Mor₁) : StructuralAtom
  /-- The expression for the right unitor `(ρ_ f).hom`. -/
  | rightUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the right unitor `(ρ_ f).inv`. -/
  | rightUnitorInv (f : Mor₁) : StructuralAtom
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.StructuralAtom

full_name: Mathlib.Tactic.Monoidal.StructuralAtom.rightUnitorInv
code: /-- Expressions for atomic structural 2-morphisms. -/
inductive StructuralAtom : Type
  /-- The expression for the associator `(α_ f g h).hom`. -/
  | associator (f g h : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the associator `(α_ f g h).inv`. -/
  | associatorInv (f g h : Mor₁) : StructuralAtom
  /-- The expression for the left unitor `(λ_ f).hom`. -/
  | leftUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the left unitor `(λ_ f).inv`. -/
  | leftUnitorInv (f : Mor₁) : StructuralAtom
  /-- The expression for the right unitor `(ρ_ f).hom`. -/
  | rightUnitor (f : Mor₁) : StructuralAtom
  /-- The expression for the inverse of the right unitor `(ρ_ f).inv`. -/
  | rightUnitorInv (f : Mor₁) : StructuralAtom
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.StructuralAtom

full_name: Mathlib.Tactic.Monoidal.structuralAtom?
code: /-- Construct a `StructuralAtom` expression from a Lean expression. -/
def structuralAtom? (e : Expr) : MetaM (Option StructuralAtom) 
goal: Lean.MetaM (Option Mathlib.Tactic.Monoidal.StructuralAtom)

full_name: Mathlib.Tactic.Monoidal.instInhabitedAtom
code: /-- Expressions for atomic non-structural 2-morphisms. -/
structure Atom where
  /-- Extract a Lean expression from an `Atom` expression. -/
  e : Expr
  deriving Inhabited
goal: Inhabited Mathlib.Tactic.Monoidal.Atom

full_name: Mathlib.Tactic.Monoidal.Atom
code: /-- Expressions for atomic non-structural 2-morphisms. -/
structure Atom where
  /-- Extract a Lean expression from an `Atom` expression. -/
  e : Expr
  deriving Inhabited
goal: Type

full_name: Mathlib.Tactic.Monoidal.Atom.e
code: /-- Expressions for atomic non-structural 2-morphisms. -/
structure Atom where
  /-- Extract a Lean expression from an `Atom` expression. -/
  e : Expr
  deriving Inhabited
goal: Lean.Expr

full_name: Mathlib.Tactic.Monoidal.instInhabitedWhiskerRightExpr
code: /-- Expressions of the form `η ▷ f₁ ▷ ... ▷ fₙ`. -/
inductive WhiskerRightExpr : Type
  /-- Construct the expression for an atomic 2-morphism. -/
  | of (η : Atom) : WhiskerRightExpr
  /-- Construct the expression for `η ▷ f`. -/
  | whisker (η : WhiskerRightExpr) (f : Atom₁) : WhiskerRightExpr
  deriving Inhabited
goal: Inhabited Mathlib.Tactic.Monoidal.WhiskerRightExpr

full_name: Mathlib.Tactic.Monoidal.WhiskerRightExpr.of
code: /-- Expressions of the form `η ▷ f₁ ▷ ... ▷ fₙ`. -/
inductive WhiskerRightExpr : Type
  /-- Construct the expression for an atomic 2-morphism. -/
  | of (η : Atom) : WhiskerRightExpr
  /-- Construct the expression for `η ▷ f`. -/
  | whisker (η : WhiskerRightExpr) (f : Atom₁) : WhiskerRightExpr
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.WhiskerRightExpr

full_name: Mathlib.Tactic.Monoidal.WhiskerRightExpr
code: /-- Expressions of the form `η ▷ f₁ ▷ ... ▷ fₙ`. -/
inductive WhiskerRightExpr : Type
  /-- Construct the expression for an atomic 2-morphism. -/
  | of (η : Atom) : WhiskerRightExpr
  /-- Construct the expression for `η ▷ f`. -/
  | whisker (η : WhiskerRightExpr) (f : Atom₁) : WhiskerRightExpr
  deriving Inhabited
goal: Type

full_name: Mathlib.Tactic.Monoidal.WhiskerRightExpr.whisker
code: /-- Expressions of the form `η ▷ f₁ ▷ ... ▷ fₙ`. -/
inductive WhiskerRightExpr : Type
  /-- Construct the expression for an atomic 2-morphism. -/
  | of (η : Atom) : WhiskerRightExpr
  /-- Construct the expression for `η ▷ f`. -/
  | whisker (η : WhiskerRightExpr) (f : Atom₁) : WhiskerRightExpr
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.WhiskerRightExpr

full_name: Mathlib.Tactic.Monoidal.WhiskerLeftExpr.of
code: /-- Expressions of the form `f₁ ◁ ... ◁ fₙ ◁ η`. -/
inductive WhiskerLeftExpr : Type
  /-- Construct the expression for a right-whiskered 2-morphism. -/
  | of (η : WhiskerRightExpr) : WhiskerLeftExpr
  /-- Construct the expression for `f ◁ η`. -/
  | whisker (f : Atom₁) (η : WhiskerLeftExpr) : WhiskerLeftExpr
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.WhiskerLeftExpr

full_name: Mathlib.Tactic.Monoidal.WhiskerLeftExpr
code: /-- Expressions of the form `f₁ ◁ ... ◁ fₙ ◁ η`. -/
inductive WhiskerLeftExpr : Type
  /-- Construct the expression for a right-whiskered 2-morphism. -/
  | of (η : WhiskerRightExpr) : WhiskerLeftExpr
  /-- Construct the expression for `f ◁ η`. -/
  | whisker (f : Atom₁) (η : WhiskerLeftExpr) : WhiskerLeftExpr
  deriving Inhabited
goal: Type

full_name: Mathlib.Tactic.Monoidal.instInhabitedWhiskerLeftExpr
code: /-- Expressions of the form `f₁ ◁ ... ◁ fₙ ◁ η`. -/
inductive WhiskerLeftExpr : Type
  /-- Construct the expression for a right-whiskered 2-morphism. -/
  | of (η : WhiskerRightExpr) : WhiskerLeftExpr
  /-- Construct the expression for `f ◁ η`. -/
  | whisker (f : Atom₁) (η : WhiskerLeftExpr) : WhiskerLeftExpr
  deriving Inhabited
goal: Inhabited Mathlib.Tactic.Monoidal.WhiskerLeftExpr

full_name: Mathlib.Tactic.Monoidal.WhiskerLeftExpr.whisker
code: /-- Expressions of the form `f₁ ◁ ... ◁ fₙ ◁ η`. -/
inductive WhiskerLeftExpr : Type
  /-- Construct the expression for a right-whiskered 2-morphism. -/
  | of (η : WhiskerRightExpr) : WhiskerLeftExpr
  /-- Construct the expression for `f ◁ η`. -/
  | whisker (f : Atom₁) (η : WhiskerLeftExpr) : WhiskerLeftExpr
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.WhiskerLeftExpr

full_name: Mathlib.Tactic.Monoidal.Structural.whiskerLeft
code: /-- Expressions for structural 2-morphisms. -/
inductive Structural : Type
  /-- Expressions for atomic structural 2-morphisms. -/
  | atom (η : StructuralAtom) : Structural
  /-- Expressions for the identity `𝟙 f`. -/
  | id (f : Mor₁) : Structural
  /-- Expressions for the composition `η ≫ θ`. -/
  | comp (α β : Structural) : Structural
  /-- Expressions for the left whiskering `f ◁ η`. -/
  | whiskerLeft (f : Mor₁) (η : Structural) : Structural
  /-- Expressions for the right whiskering `η ▷ f`. -/
  | whiskerRight (η : Structural) (f : Mor₁) : Structural
  /-- Expressions for `α` in the monoidal composition `η ⊗≫ θ := η ≫ α ≫ θ`. -/
  | monoidalCoherence (f g : Mor₁) (e : Expr) : Structural
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.Structural

full_name: Mathlib.Tactic.Monoidal.Structural.whiskerRight
code: /-- Expressions for structural 2-morphisms. -/
inductive Structural : Type
  /-- Expressions for atomic structural 2-morphisms. -/
  | atom (η : StructuralAtom) : Structural
  /-- Expressions for the identity `𝟙 f`. -/
  | id (f : Mor₁) : Structural
  /-- Expressions for the composition `η ≫ θ`. -/
  | comp (α β : Structural) : Structural
  /-- Expressions for the left whiskering `f ◁ η`. -/
  | whiskerLeft (f : Mor₁) (η : Structural) : Structural
  /-- Expressions for the right whiskering `η ▷ f`. -/
  | whiskerRight (η : Structural) (f : Mor₁) : Structural
  /-- Expressions for `α` in the monoidal composition `η ⊗≫ θ := η ≫ α ≫ θ`. -/
  | monoidalCoherence (f g : Mor₁) (e : Expr) : Structural
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.Structural

full_name: Mathlib.Tactic.Monoidal.Structural
code: /-- Expressions for structural 2-morphisms. -/
inductive Structural : Type
  /-- Expressions for atomic structural 2-morphisms. -/
  | atom (η : StructuralAtom) : Structural
  /-- Expressions for the identity `𝟙 f`. -/
  | id (f : Mor₁) : Structural
  /-- Expressions for the composition `η ≫ θ`. -/
  | comp (α β : Structural) : Structural
  /-- Expressions for the left whiskering `f ◁ η`. -/
  | whiskerLeft (f : Mor₁) (η : Structural) : Structural
  /-- Expressions for the right whiskering `η ▷ f`. -/
  | whiskerRight (η : Structural) (f : Mor₁) : Structural
  /-- Expressions for `α` in the monoidal composition `η ⊗≫ θ := η ≫ α ≫ θ`. -/
  | monoidalCoherence (f g : Mor₁) (e : Expr) : Structural
  deriving Inhabited
goal: Type

full_name: Mathlib.Tactic.Monoidal.instInhabitedStructural
code: /-- Expressions for structural 2-morphisms. -/
inductive Structural : Type
  /-- Expressions for atomic structural 2-morphisms. -/
  | atom (η : StructuralAtom) : Structural
  /-- Expressions for the identity `𝟙 f`. -/
  | id (f : Mor₁) : Structural
  /-- Expressions for the composition `η ≫ θ`. -/
  | comp (α β : Structural) : Structural
  /-- Expressions for the left whiskering `f ◁ η`. -/
  | whiskerLeft (f : Mor₁) (η : Structural) : Structural
  /-- Expressions for the right whiskering `η ▷ f`. -/
  | whiskerRight (η : Structural) (f : Mor₁) : Structural
  /-- Expressions for `α` in the monoidal composition `η ⊗≫ θ := η ≫ α ≫ θ`. -/
  | monoidalCoherence (f g : Mor₁) (e : Expr) : Structural
  deriving Inhabited
goal: Inhabited Mathlib.Tactic.Monoidal.Structural

full_name: Mathlib.Tactic.Monoidal.Structural.atom
code: /-- Expressions for structural 2-morphisms. -/
inductive Structural : Type
  /-- Expressions for atomic structural 2-morphisms. -/
  | atom (η : StructuralAtom) : Structural
  /-- Expressions for the identity `𝟙 f`. -/
  | id (f : Mor₁) : Structural
  /-- Expressions for the composition `η ≫ θ`. -/
  | comp (α β : Structural) : Structural
  /-- Expressions for the left whiskering `f ◁ η`. -/
  | whiskerLeft (f : Mor₁) (η : Structural) : Structural
  /-- Expressions for the right whiskering `η ▷ f`. -/
  | whiskerRight (η : Structural) (f : Mor₁) : Structural
  /-- Expressions for `α` in the monoidal composition `η ⊗≫ θ := η ≫ α ≫ θ`. -/
  | monoidalCoherence (f g : Mor₁) (e : Expr) : Structural
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.Structural

full_name: Mathlib.Tactic.Monoidal.Structural.id
code: /-- Expressions for structural 2-morphisms. -/
inductive Structural : Type
  /-- Expressions for atomic structural 2-morphisms. -/
  | atom (η : StructuralAtom) : Structural
  /-- Expressions for the identity `𝟙 f`. -/
  | id (f : Mor₁) : Structural
  /-- Expressions for the composition `η ≫ θ`. -/
  | comp (α β : Structural) : Structural
  /-- Expressions for the left whiskering `f ◁ η`. -/
  | whiskerLeft (f : Mor₁) (η : Structural) : Structural
  /-- Expressions for the right whiskering `η ▷ f`. -/
  | whiskerRight (η : Structural) (f : Mor₁) : Structural
  /-- Expressions for `α` in the monoidal composition `η ⊗≫ θ := η ≫ α ≫ θ`. -/
  | monoidalCoherence (f g : Mor₁) (e : Expr) : Structural
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.Structural

full_name: Mathlib.Tactic.Monoidal.Structural.monoidalCoherence
code: /-- Expressions for structural 2-morphisms. -/
inductive Structural : Type
  /-- Expressions for atomic structural 2-morphisms. -/
  | atom (η : StructuralAtom) : Structural
  /-- Expressions for the identity `𝟙 f`. -/
  | id (f : Mor₁) : Structural
  /-- Expressions for the composition `η ≫ θ`. -/
  | comp (α β : Structural) : Structural
  /-- Expressions for the left whiskering `f ◁ η`. -/
  | whiskerLeft (f : Mor₁) (η : Structural) : Structural
  /-- Expressions for the right whiskering `η ▷ f`. -/
  | whiskerRight (η : Structural) (f : Mor₁) : Structural
  /-- Expressions for `α` in the monoidal composition `η ⊗≫ θ := η ≫ α ≫ θ`. -/
  | monoidalCoherence (f g : Mor₁) (e : Expr) : Structural
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.Structural

full_name: Mathlib.Tactic.Monoidal.Structural.comp
code: /-- Expressions for structural 2-morphisms. -/
inductive Structural : Type
  /-- Expressions for atomic structural 2-morphisms. -/
  | atom (η : StructuralAtom) : Structural
  /-- Expressions for the identity `𝟙 f`. -/
  | id (f : Mor₁) : Structural
  /-- Expressions for the composition `η ≫ θ`. -/
  | comp (α β : Structural) : Structural
  /-- Expressions for the left whiskering `f ◁ η`. -/
  | whiskerLeft (f : Mor₁) (η : Structural) : Structural
  /-- Expressions for the right whiskering `η ▷ f`. -/
  | whiskerRight (η : Structural) (f : Mor₁) : Structural
  /-- Expressions for `α` in the monoidal composition `η ⊗≫ θ := η ≫ α ≫ θ`. -/
  | monoidalCoherence (f g : Mor₁) (e : Expr) : Structural
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.Structural

full_name: Mathlib.Tactic.Monoidal.NormalExpr.cons
code: /-- Normalized expressions for 2-morphisms. -/
inductive NormalExpr : Type
  /-- Construct the expression for a structural 2-morphism. -/
  | nil (α : Structural) : NormalExpr
  /-- Construct the normalized expression of 2-morphisms recursively. -/
  | cons (head_structural : Structural) (head : WhiskerLeftExpr) (tail : NormalExpr) : NormalExpr
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.NormalExpr.nil
code: /-- Normalized expressions for 2-morphisms. -/
inductive NormalExpr : Type
  /-- Construct the expression for a structural 2-morphism. -/
  | nil (α : Structural) : NormalExpr
  /-- Construct the normalized expression of 2-morphisms recursively. -/
  | cons (head_structural : Structural) (head : WhiskerLeftExpr) (tail : NormalExpr) : NormalExpr
  deriving Inhabited
goal: Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.NormalExpr
code: /-- Normalized expressions for 2-morphisms. -/
inductive NormalExpr : Type
  /-- Construct the expression for a structural 2-morphism. -/
  | nil (α : Structural) : NormalExpr
  /-- Construct the normalized expression of 2-morphisms recursively. -/
  | cons (head_structural : Structural) (head : WhiskerLeftExpr) (tail : NormalExpr) : NormalExpr
  deriving Inhabited
goal: Type

full_name: Mathlib.Tactic.Monoidal.instInhabitedNormalExpr
code: /-- Normalized expressions for 2-morphisms. -/
inductive NormalExpr : Type
  /-- Construct the expression for a structural 2-morphism. -/
  | nil (α : Structural) : NormalExpr
  /-- Construct the normalized expression of 2-morphisms recursively. -/
  | cons (head_structural : Structural) (head : WhiskerLeftExpr) (tail : NormalExpr) : NormalExpr
  deriving Inhabited
goal: Inhabited Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.src
code: /-- The domain of a morphism. -/
def src (η : Expr) : MetaM Mor₁ 
goal: Lean.MetaM Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.tgt
code: /-- The codomain of a morphism. -/
def tgt (η : Expr) : MetaM Mor₁ 
goal: Lean.MetaM Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.Atom.src
code: /-- The domain of a 2-morphism. -/
def Atom.src (η : Atom) : MetaM Mor₁ 
goal: Lean.MetaM Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.Atom.tgt
code: /-- The codomain of a 2-morphism. -/
def Atom.tgt (η : Atom) : MetaM Mor₁ 
goal: Lean.MetaM Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.WhiskerRightExpr.src
code: /-- The domain of a 2-morphism. -/
def WhiskerRightExpr.src : WhiskerRightExpr → MetaM Mor₁
  
goal: Mathlib.Tactic.Monoidal.WhiskerRightExpr → Lean.MetaM Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.WhiskerRightExpr.tgt
code: /-- The codomain of a 2-morphism. -/
def WhiskerRightExpr.tgt : WhiskerRightExpr → MetaM Mor₁
  
goal: Mathlib.Tactic.Monoidal.WhiskerRightExpr → Lean.MetaM Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.WhiskerLeftExpr.src
code: /-- The domain of a 2-morphism. -/
def WhiskerLeftExpr.src : WhiskerLeftExpr → MetaM Mor₁
  
goal: Mathlib.Tactic.Monoidal.WhiskerLeftExpr → Lean.MetaM Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.WhiskerLeftExpr.tgt
code: /-- The codomain of a 2-morphism. -/
def WhiskerLeftExpr.tgt : WhiskerLeftExpr → MetaM Mor₁
  
goal: Mathlib.Tactic.Monoidal.WhiskerLeftExpr → Lean.MetaM Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.StructuralAtom.src
code: /-- The domain of a 2-morphism. -/
def StructuralAtom.src : StructuralAtom → Mor₁
  
goal: Mathlib.Tactic.Monoidal.StructuralAtom → Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.StructuralAtom.tgt
code: /-- The codomain of a 2-morphism. -/
def StructuralAtom.tgt : StructuralAtom → Mor₁
  
goal: Mathlib.Tactic.Monoidal.StructuralAtom → Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.Structural.src
code: /-- The domain of a 2-morphism. -/
def Structural.src : Structural → Mor₁
  
goal: Mathlib.Tactic.Monoidal.Structural → Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.Structural.tgt
code: /-- The codomain of a 2-morphism. -/
def Structural.tgt : Structural → Mor₁
  
goal: Mathlib.Tactic.Monoidal.Structural → Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.NormalExpr.src
code: /-- The domain of a 2-morphism. -/
def NormalExpr.src : NormalExpr → Mor₁
  
goal: Mathlib.Tactic.Monoidal.NormalExpr → Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.NormalExpr.tgt
code: /-- The codomain of a 2-morphism. -/
def NormalExpr.tgt : NormalExpr → Mor₁
  
goal: Mathlib.Tactic.Monoidal.NormalExpr → Mathlib.Tactic.Monoidal.Mor₁

full_name: Mathlib.Tactic.Monoidal.NormalExpr.associator
code: /-- The associator as a term of `normalExpr`. -/
def NormalExpr.associator (f g h : Mor₁) : NormalExpr 
goal: Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.NormalExpr.associatorInv
code: /-- The inverse of the associator as a term of `normalExpr`. -/
def NormalExpr.associatorInv (f g h : Mor₁) : NormalExpr 
goal: Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.NormalExpr.leftUnitor
code: /-- The left unitor as a term of `normalExpr`. -/
def NormalExpr.leftUnitor (f : Mor₁) : NormalExpr 
goal: Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.NormalExpr.leftUnitorInv
code: /-- The inverse of the left unitor as a term of `normalExpr`. -/
def NormalExpr.leftUnitorInv (f : Mor₁) : NormalExpr 
goal: Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.NormalExpr.rightUnitor
code: /-- The right unitor as a term of `normalExpr`. -/
def NormalExpr.rightUnitor (f : Mor₁) : NormalExpr 
goal: Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.NormalExpr.rightUnitorInv
code: /-- The inverse of the right unitor as a term of `normalExpr`. -/
def NormalExpr.rightUnitorInv (f : Mor₁) : NormalExpr 
goal: Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.WhiskerRightExpr.atom
code: /-- Return `η` for `η ▷ g₁ ▷ ... ▷ gₙ`. -/
def WhiskerRightExpr.atom : WhiskerRightExpr → Atom
  
goal: Mathlib.Tactic.Monoidal.WhiskerRightExpr → Mathlib.Tactic.Monoidal.Atom

full_name: Mathlib.Tactic.Monoidal.WhiskerLeftExpr.atom
code: /-- Return `η` for `f₁ ◁ ... ◁ fₙ ◁ η ▷ g₁ ▷ ... ▷ gₙ`. -/
def WhiskerLeftExpr.atom : WhiskerLeftExpr → Atom
  
goal: Mathlib.Tactic.Monoidal.WhiskerLeftExpr → Mathlib.Tactic.Monoidal.Atom

full_name: Mathlib.Tactic.Monoidal.structural?
code: /-- Construct a `Structural` expression from a Lean expression for a structural 2-morphism. -/
partial def structural? (e : Expr) : MetaM Structural 
goal: Lean.MetaM Mathlib.Tactic.Monoidal.Structural

full_name: Mathlib.Tactic.Monoidal.NormalExpr.of
code: /-- Construct a `NormalExpr` expression from a `WhiskerLeftExpr` expression. -/
def NormalExpr.of (η : WhiskerLeftExpr) : MetaM NormalExpr 
goal: Lean.MetaM Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.NormalExpr.ofExpr
code: /-- Construct a `NormalExpr` expression from a Lean expression for an atomic 2-morphism. -/
def NormalExpr.ofExpr (η : Expr) : MetaM NormalExpr 
goal: Lean.MetaM Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.structuralOfMonoidalComp
code: /-- If `e` is an expression of the form `η ⊗≫ θ := η ≫ α ≫ θ` in the monoidal category `C`,
return the expression for `α` .-/
def structuralOfMonoidalComp (C e : Expr) : MetaM Structural 
goal: Lean.MetaM Mathlib.Tactic.Monoidal.Structural

full_name: Mathlib.Tactic.Monoidal.evalComp_nil_cons
code: theorem evalComp_nil_cons {f g h i j : C} (α : f ⟶ g) (β : g ⟶ h) (η : h ⟶ i) (ηs : i ⟶ j) :
    α ≫ (β ≫ η ≫ ηs) = (α ≫ β) ≫ η ≫ ηs 
goal: CategoryTheory.CategoryStruct.comp α (CategoryTheory.CategoryStruct.comp β (CategoryTheory.CategoryStruct.comp η ηs)) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.CategoryStruct.comp α β) (CategoryTheory.CategoryStruct.comp η ηs)

full_name: Mathlib.Tactic.Monoidal.evalComp_nil_nil
code: @[nolint synTaut]
theorem evalComp_nil_nil {f g h : C} (α : f ⟶ g) (β : g ⟶ h) :
    α ≫ β = α ≫ β 
goal: CategoryTheory.CategoryStruct.comp α β = CategoryTheory.CategoryStruct.comp α β

full_name: Mathlib.Tactic.Monoidal.evalComp_cons
code: theorem evalComp_cons {f g h i j : C} (α : f ⟶ g) (η : g ⟶ h) {ηs : h ⟶ i} {θ : i ⟶ j} {ι : h ⟶ j}
    (pf_ι : ηs ≫ θ = ι)  :
    (α ≫ η ≫ ηs) ≫ θ = α ≫ η ≫ ι 
goal: CategoryTheory.CategoryStruct.comp (CategoryTheory.CategoryStruct.comp α (CategoryTheory.CategoryStruct.comp η ηs)) θ =
  CategoryTheory.CategoryStruct.comp α (CategoryTheory.CategoryStruct.comp η ι)

full_name: Mathlib.Tactic.Monoidal.evalWhiskerLeft_nil
code: @[nolint synTaut]
theorem evalWhiskerLeft_nil (f : C) (α : g ⟶ h) :
    f ◁ α = f ◁ α 
goal: CategoryTheory.MonoidalCategory.whiskerLeft f α = CategoryTheory.MonoidalCategory.whiskerLeft f α

full_name: Mathlib.Tactic.Monoidal.evalWhiskerLeft_of_cons
code: theorem evalWhiskerLeft_of_cons
    (α : g ⟶ h) (η : h ⟶ i) {ηs : i ⟶ j} {θ : f ⊗ i ⟶ f ⊗ j} (pf_θ : f ◁ ηs = θ) :
    f ◁ (α ≫ η ≫ ηs) = f ◁ α ≫ f ◁ η ≫ θ 
goal: CategoryTheory.MonoidalCategory.whiskerLeft f
    (CategoryTheory.CategoryStruct.comp α (CategoryTheory.CategoryStruct.comp η ηs)) =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.whiskerLeft f α)
    (CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.whiskerLeft f η) θ)

full_name: Mathlib.Tactic.Monoidal.evalWhiskerLeft_comp
code: theorem evalWhiskerLeft_comp {η : h ⟶ i} {θ : g ⊗ h ⟶ g ⊗ i} {ι : f ⊗ g ⊗ h ⟶ f ⊗ g ⊗ i}
    {ι' : f ⊗ g ⊗ h ⟶ (f ⊗ g) ⊗ i} {ι'' : (f ⊗ g) ⊗ h ⟶ (f ⊗ g) ⊗ i}
    (pf_θ : g ◁ η = θ) (pf_ι : f ◁ θ = ι)
    (pf_ι' : ι ≫ (α_ _ _ _).inv = ι') (pf_ι'' : (α_ _ _ _).hom ≫ ι' = ι'') :
    (f ⊗ g) ◁ η = ι'' 
goal: CategoryTheory.MonoidalCategory.whiskerLeft (CategoryTheory.MonoidalCategory.tensorObj f g) η = ι''

full_name: Mathlib.Tactic.Monoidal.evalWhiskerLeft_id
code: theorem evalWhiskerLeft_id {f g : C} {η : f ⟶ g}
    {η' : f ⟶ 𝟙_ C ⊗ g} {η'' : 𝟙_ C ⊗ f ⟶ 𝟙_ C ⊗ g}
    (pf_η' : η ≫ (λ_ _).inv = η') (pf_η'' : (λ_ _).hom ≫ η' = η'') :
    𝟙_ C ◁ η = η'' 
goal: CategoryTheory.MonoidalCategory.whiskerLeft (𝟙_ C) η = η''

full_name: Mathlib.Tactic.Monoidal.eval_comp
code: theorem eval_comp
    {η η' : f ⟶ g} {θ θ' : g ⟶ h} {ι : f ⟶ h}
    (pf_η : η = η') (pf_θ : θ = θ') (pf_ηθ : η' ≫ θ' = ι) :
    η ≫ θ = ι 
goal: CategoryTheory.CategoryStruct.comp η θ = ι

full_name: Mathlib.Tactic.Monoidal.eval_whiskerLeft
code: theorem eval_whiskerLeft
    {η η' : g ⟶ h} {θ : f ⊗ g ⟶ f ⊗ h}
    (pf_η : η = η') (pf_θ : f ◁ η' = θ) :
    f ◁ η = θ 
goal: CategoryTheory.MonoidalCategory.whiskerLeft f η = θ

full_name: Mathlib.Tactic.Monoidal.eval_whiskerRight
code: theorem eval_whiskerRight
    {η η' : f ⟶ g} {θ : f ⊗ h ⟶ g ⊗ h}
    (pf_η : η = η') (pf_θ : η' ▷ h = θ) :
    η ▷ h = θ 
goal: CategoryTheory.MonoidalCategory.whiskerRight η h = θ

full_name: Mathlib.Tactic.Monoidal.eval_of
code: theorem eval_of (η : f ⟶ g) :
    η = 𝟙 _ ≫ η ≫ 𝟙 _ 
goal: η =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.CategoryStruct.id f)
    (CategoryTheory.CategoryStruct.comp η (CategoryTheory.CategoryStruct.id g))

full_name: Mathlib.Tactic.Monoidal.evalWhiskerRight_nil
code: @[nolint synTaut]
theorem evalWhiskerRight_nil (α : f ⟶ g) (h : C) :
    α ▷ h = α ▷ h 
goal: CategoryTheory.MonoidalCategory.whiskerRight α h = CategoryTheory.MonoidalCategory.whiskerRight α h

full_name: Mathlib.Tactic.Monoidal.evalWhiskerRight_cons_of_of
code: theorem evalWhiskerRight_cons_of_of
    (α : f ⟶ g) (η : g ⟶ h) {ηs : h ⟶ i} {θ : h ⊗ j ⟶ i ⊗ j}
    (pf_θ : ηs ▷ j = θ) :
    (α ≫ η ≫ ηs) ▷ j = α ▷ j ≫ η ▷ j ≫ θ 
goal: CategoryTheory.MonoidalCategory.whiskerRight
    (CategoryTheory.CategoryStruct.comp α (CategoryTheory.CategoryStruct.comp η ηs)) j =
  CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.whiskerRight α j)
    (CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.whiskerRight η j) θ)

full_name: Mathlib.Tactic.Monoidal.evalWhiskerRight_cons_whisker
code: theorem evalWhiskerRight_cons_whisker
    {α : g ⟶ f ⊗ h} {η : h ⟶ i} {ηs : f ⊗ i ⟶ j} {k : C}
    {η₁ : h ⊗ k ⟶ i ⊗ k} {η₂ : f ⊗ (h ⊗ k) ⟶ f ⊗ (i ⊗ k)} {ηs₁ : (f ⊗ i) ⊗ k ⟶ j ⊗ k}
    {ηs₂ : f ⊗ (i ⊗ k) ⟶ j ⊗ k} {η₃ : f ⊗ (h ⊗ k) ⟶ j ⊗ k} {η₄ : (f ⊗ h) ⊗ k ⟶ j ⊗ k}
    {η₅ : g ⊗ k ⟶ j ⊗ k}
    (pf_η₁ : (𝟙 _ ≫ η ≫ 𝟙 _ ) ▷ k = η₁) (pf_η₂ : f ◁ η₁ = η₂)
    (pf_ηs₁ : ηs ▷ k = ηs₁) (pf_ηs₂ : (α_ _ _ _).inv ≫ ηs₁ = ηs₂)
    (pf_η₃ : η₂ ≫ ηs₂ = η₃) (pf_η₄ : (α_ _ _ _).hom ≫ η₃ = η₄) (pf_η₅ : α ▷ k ≫ η₄ = η₅) :
    (α ≫ (f ◁ η) ≫ ηs) ▷ k = η₅ 
goal: CategoryTheory.MonoidalCategory.whiskerRight
    (CategoryTheory.CategoryStruct.comp α
      (CategoryTheory.CategoryStruct.comp (CategoryTheory.MonoidalCategory.whiskerLeft f η) ηs))
    k =
  η₅

full_name: Mathlib.Tactic.Monoidal.evalWhiskerRight_comp
code: theorem evalWhiskerRight_comp
    {η : f ⟶ f'} {η₁ : f ⊗ g ⟶ f' ⊗ g} {η₂ : (f ⊗ g) ⊗ h ⟶ (f' ⊗ g) ⊗ h}
    {η₃ : (f ⊗ g) ⊗ h ⟶ f' ⊗ (g ⊗ h)} {η₄ : f ⊗ (g ⊗ h) ⟶ f' ⊗ (g ⊗ h)}
    (pf_η₁ : η ▷ g = η₁) (pf_η₂ : η₁ ▷ h = η₂)
    (pf_η₃ : η₂ ≫ (α_ _ _ _).hom = η₃) (pf_η₄ : (α_ _ _ _).inv ≫ η₃ = η₄) :
    η ▷ (g ⊗ h) = η₄ 
goal: CategoryTheory.MonoidalCategory.whiskerRight η (CategoryTheory.MonoidalCategory.tensorObj g h) = η₄

full_name: Mathlib.Tactic.Monoidal.evalWhiskerRight_id
code: theorem evalWhiskerRight_id
    {η : f ⟶ g} {η₁ : f ⟶ g ⊗ 𝟙_ C} {η₂ : f ⊗ 𝟙_ C ⟶ g ⊗ 𝟙_ C}
    (pf_η₁ : η ≫ (ρ_ _).inv = η₁) (pf_η₂ : (ρ_ _).hom ≫ η₁ = η₂) :
    η ▷ 𝟙_ C = η₂ 
goal: CategoryTheory.MonoidalCategory.whiskerRight η (𝟙_ C) = η₂

full_name: Mathlib.Tactic.Monoidal.eval_monoidalComp
code: theorem eval_monoidalComp
    {η η' : f ⟶ g} {α : g ⟶ h} {θ θ' : h ⟶ i} {αθ : g ⟶ i} {ηαθ : f ⟶ i}
    (pf_η : η = η') (pf_θ : θ = θ') (pf_αθ : α ≫ θ' = αθ) (pf_ηαθ : η' ≫ αθ = ηαθ) :
    η ≫ α ≫ θ = ηαθ 
goal: CategoryTheory.CategoryStruct.comp η (CategoryTheory.CategoryStruct.comp α θ) = ηαθ

full_name: Mathlib.Tactic.Monoidal.Mor₁.e
code: /-- Extract a Lean expression from a `Mor₁` expression. -/
def Mor₁.e : Mor₁ → MonoidalM Expr
  
goal: Mathlib.Tactic.Monoidal.Mor₁ → Mathlib.Tactic.Monoidal.MonoidalM Lean.Expr

full_name: Mathlib.Tactic.Monoidal.StructuralAtom.e
code: /-- Extract a Lean expression from a `StructuralAtom` expression. -/
def StructuralAtom.e : StructuralAtom → MonoidalM Expr
  
goal: Mathlib.Tactic.Monoidal.StructuralAtom → Mathlib.Tactic.Monoidal.MonoidalM Lean.Expr

full_name: Mathlib.Tactic.Monoidal.Structural.e
code: /-- Extract a Lean expression from a `Structural` expression. -/
partial def Structural.e : Structural → MonoidalM Expr
  
goal: Mathlib.Tactic.Monoidal.Structural → Mathlib.Tactic.Monoidal.MonoidalM Lean.Expr

full_name: Mathlib.Tactic.Monoidal.WhiskerRightExpr.e
code: /-- Extract a Lean expression from a `WhiskerRightExpr` expression. -/
def WhiskerRightExpr.e : WhiskerRightExpr → MonoidalM Expr
  
goal: Mathlib.Tactic.Monoidal.WhiskerRightExpr → Mathlib.Tactic.Monoidal.MonoidalM Lean.Expr

full_name: Mathlib.Tactic.Monoidal.WhiskerLeftExpr.e
code: /-- Extract a Lean expression from a `WhiskerLeftExpr` expression. -/
def WhiskerLeftExpr.e : WhiskerLeftExpr → MonoidalM Expr
  
goal: Mathlib.Tactic.Monoidal.WhiskerLeftExpr → Mathlib.Tactic.Monoidal.MonoidalM Lean.Expr

full_name: Mathlib.Tactic.Monoidal.NormalExpr.e
code: /-- Extract a Lean expression from a `NormalExpr` expression. -/
def NormalExpr.e : NormalExpr → MonoidalM Expr
  
goal: Mathlib.Tactic.Monoidal.NormalExpr → Mathlib.Tactic.Monoidal.MonoidalM Lean.Expr

full_name: Mathlib.Tactic.Monoidal.Result
code: /-- The result of evaluating an expression into normal form. -/
structure Result where
  /-- The normalized expression of the 2-morphism. -/
  expr : NormalExpr
  /-- The proof that the normalized expression is equal to the original expression. -/
  proof : Expr
goal: Type

full_name: Mathlib.Tactic.Monoidal.Result.proof
code: /-- The result of evaluating an expression into normal form. -/
structure Result where
  /-- The normalized expression of the 2-morphism. -/
  expr : NormalExpr
  /-- The proof that the normalized expression is equal to the original expression. -/
  proof : Expr
goal: Lean.Expr

full_name: Mathlib.Tactic.Monoidal.Result.expr
code: /-- The result of evaluating an expression into normal form. -/
structure Result where
  /-- The normalized expression of the 2-morphism. -/
  expr : NormalExpr
  /-- The proof that the normalized expression is equal to the original expression. -/
  proof : Expr
goal: Mathlib.Tactic.Monoidal.NormalExpr

full_name: Mathlib.Tactic.Monoidal.evalComp
code: /-- Evaluate the expression `η ≫ θ` into a normalized form. -/
partial def evalComp : NormalExpr → NormalExpr → MonoidalM Result
  
goal: Mathlib.Tactic.Monoidal.NormalExpr →
  Mathlib.Tactic.Monoidal.NormalExpr → Mathlib.Tactic.Monoidal.MonoidalM Mathlib.Tactic.Monoidal.Result

full_name: Mathlib.Tactic.Monoidal.evalWhiskerLeftExpr
code: /-- Evaluate the expression `f ◁ η` into a normalized form. -/
partial def evalWhiskerLeftExpr : Mor₁ → NormalExpr → MonoidalM Result
  
goal: Mathlib.Tactic.Monoidal.Mor₁ →
  Mathlib.Tactic.Monoidal.NormalExpr → Mathlib.Tactic.Monoidal.MonoidalM Mathlib.Tactic.Monoidal.Result

full_name: Mathlib.Tactic.Monoidal.evalWhiskerRightExpr
code: /-- Evaluate the expression `η ▷ f` into a normalized form. -/
partial def evalWhiskerRightExpr : NormalExpr → Mor₁ → MonoidalM Result
  
goal: Mathlib.Tactic.Monoidal.NormalExpr →
  Mathlib.Tactic.Monoidal.Mor₁ → Mathlib.Tactic.Monoidal.MonoidalM Mathlib.Tactic.Monoidal.Result

full_name: Mathlib.Tactic.Monoidal.eval
code: /-- Evaluate the expression of a 2-morphism into a normalized form. -/
partial def eval (e : Expr) : MonoidalM Result 
goal: Mathlib.Tactic.Monoidal.MonoidalM Mathlib.Tactic.Monoidal.Result

full_name: Mathlib.Tactic.Monoidal.NormalExpr.toList
code: /-- Convert a `NormalExpr` expression into a list of `WhiskerLeftExpr` expressions. -/
def NormalExpr.toList : NormalExpr → List WhiskerLeftExpr
  
goal: Mathlib.Tactic.Monoidal.NormalExpr → List Mathlib.Tactic.Monoidal.WhiskerLeftExpr

full_name: «termNormalize%_»
code: /-- `normalize% η` is the normalization of the 2-morphism `η`.
1. The normalized 2-morphism is of the form `α₀ ≫ η₀ ≫ α₁ ≫ η₁ ≫ ... αₘ ≫ ηₘ ≫ αₘ₊₁` where
  each `αᵢ` is a structural 2-morphism (consisting of associators and unitors),
2. each `ηᵢ` is a non-structural 2-morphism of the form `f₁ ◁ ... ◁ fₘ ◁ θ`, and
3. `θ` is of the form `ι ▷ g₁ ▷ ... ▷ gₗ`
-/
elab "normalize% " t:term:51 : term => do
  let e ← Lean.Elab.Term.elabTerm t none
  let some ctx ← mkContext? e
    | throwError "not a morphism"
  MonoidalM.run ctx do (← eval e).expr.e
goal: Lean.ParserDescr

full_name: «_aux_Mathlib_Tactic_CategoryTheory_Monoidal___elabRules_termNormalize%__1»
code: /-- `normalize% η` is the normalization of the 2-morphism `η`.
1. The normalized 2-morphism is of the form `α₀ ≫ η₀ ≫ α₁ ≫ η₁ ≫ ... αₘ ≫ ηₘ ≫ αₘ₊₁` where
  each `αᵢ` is a structural 2-morphism (consisting of associators and unitors),
2. each `ηᵢ` is a non-structural 2-morphism of the form `f₁ ◁ ... ◁ fₘ ◁ θ`, and
3. `θ` is of the form `ι ▷ g₁ ▷ ... ▷ gₗ`
-/
elab "normalize% " t:term:51 : term => do
  let e ← Lean.Elab.Term.elabTerm t none
  let some ctx ← mkContext? e
    | throwError "not a morphism"
  MonoidalM.run ctx do (← eval e).expr.e
goal: Lean.Elab.Term.TermElab

full_name: mk_eq
code: theorem mk_eq {α : Type _} (a b a' b' : α) (ha : a = a') (hb : b = b') (h : a' = b') : a = b 
goal: a = b

full_name: mkEq
code: /-- Transform an equality between 2-morphisms into the equality between their normalizations. -/
def mkEq (e : Expr) : MetaM Expr 
goal: Lean.MetaM Lean.Expr

full_name: tacticMonoidal_nf
code: /-- Normalize the both sides of an equality. -/
elab "monoidal_nf" : tactic => withMainContext do
  let t ← getMainTarget
  let mvarIds ← (← getMainGoal).apply (← mkEq t)
  replaceMainGoal mvarIds
goal: Lean.ParserDescr

full_name: _aux_Mathlib_Tactic_CategoryTheory_Monoidal___elabRules_tacticMonoidal_nf_1
code: /-- Normalize the both sides of an equality. -/
elab "monoidal_nf" : tactic => withMainContext do
  let t ← getMainTarget
  let mvarIds ← (← getMainGoal).apply (← mkEq t)
  replaceMainGoal mvarIds
goal: Lean.Elab.Tactic.Tactic