mathlib documentation

The monoidal coherence theorem #

In this file, we prove the monoidal coherence theorem, stated in the following form: the free monoidal category over any type C is thin.

We follow a proof described by Ilya Beylin and Peter Dybjer, which has been previously formalized in the proof assistant ALF. The idea is to declare a normal form (with regard to association and adding units) on objects of the free monoidal category and consider the discrete subcategory of objects that are in normal form. A normalization procedure is then just a functor full_normalize : free_monoidal_category C β₯€ discrete (normal_monoidal_object C), where functoriality says that two objects which are related by associators and unitors have the same normal form. Another desirable property of a normalization procedure is that an object is isomorphic (i.e., related via associators and unitors) to its normal form. In the case of the specific normalization procedure we use we not only get these isomorphismns, but also that they assemble into a natural isomorphism 𝟭 (free_monoidal_category C) β‰… full_normalize β‹™ inclusion. But this means that any two parallel morphisms in the free monoidal category factor through a discrete category in the same way, so they must be equal, and hence the free monoidal category is thin.

References #


We say an object in the free monoidal category is in normal form if it is of the form (((πŸ™_ C) βŠ— X₁) βŠ— Xβ‚‚) βŠ— β‹―.

Instances for category_theory.free_monoidal_category.normal_monoidal_object
  • category_theory.free_monoidal_category.normal_monoidal_object.has_sizeof_inst

Auxiliary definition for normalize. Here we prove that objects that are related by associators and unitors map to the same normal form.


The isomorphism between n βŠ— X and normalize X n is natural (in both X and n, but naturality in n is trivial and was "proved" in normalize_iso_aux). This is the real heart of our proof of the coherence theorem.

@[protected, instance]

The monoidal coherence theorem.

Auxiliary construction for showing that the free monoidal category is a groupoid. Do not use this, use is_iso.inv instead.