The symmetric monoidal category structure on R-modules #
Mostly this uses existing machinery in linear_algebra.tensor_product
.
We just need to provide a few small missing pieces to build the
monoidal_category
instance and then the symmetric_category
instance.
Note the universe level of the modules must be at least the universe level of the ring, so that we have a monoidal unit. For now, we simplify by insisting both universe levels are the same.
We then construct the monoidal closed structure on Module R
.
If you're happy using the bundled Module R
, it may be possible to mostly
use this as an interface and not need to interact much with the implementation details.
(implementation) tensor product of R-modules
Equations
- Module.monoidal_category.tensor_obj M N = Module.of R (tensor_product R ↥M ↥N)
(implementation) the associator for R-modules
Equations
- Module.monoidal_category.associator M N K = (tensor_product.assoc R ↥M ↥N ↥K).to_Module_iso
The associator_naturality
and pentagon
lemmas below are very slow to elaborate.
We give them some help by expressing the lemmas first non-categorically, then using
convert _aux using 1
to have the elaborator work as little as possible.
(implementation) the left unitor for R-modules
Equations
(implementation) the right unitor for R-modules
Equations
Equations
- Module.monoidal_category = {tensor_obj := Module.monoidal_category.tensor_obj _inst_1, tensor_hom := Module.monoidal_category.tensor_hom _inst_1, tensor_id' := _, tensor_comp' := _, tensor_unit := Module.of R R semiring.to_module, associator := Module.monoidal_category.associator _inst_1, associator_naturality' := _, left_unitor := Module.monoidal_category.left_unitor _inst_1, left_unitor_naturality' := _, right_unitor := Module.monoidal_category.right_unitor _inst_1, right_unitor_naturality' := _, pentagon' := _, triangle' := _}
Remind ourselves that the monoidal unit, being just R
, is still a commutative ring.
Equations
(implementation) the braiding for R-modules
Equations
- M.braiding N = (tensor_product.comm R ↥M ↥N).to_Module_iso
The symmetric monoidal structure on Module R
.
Equations
- Module.symmetric_category = {to_braided_category := {braiding := Module.braiding _inst_1, braiding_naturality' := _, hexagon_forward' := _, hexagon_reverse' := _}, symmetry' := _}
Auxiliary definition for the monoidal_closed
instance on Module R
.
(This is only a separate definition in order to speed up typechecking. )
Equations
- M.monoidal_closed_hom_equiv N P = {to_fun := λ (f : (category_theory.monoidal_category.tensor_left M).obj N ⟶ P), (tensor_product.mk R ↥N ↥M).compr₂ ((β_ N M).hom ≫ f), inv_fun := λ (f : N ⟶ ((category_theory.linear_coyoneda R (Module R)).obj (opposite.op M)).obj P), (β_ M N).hom ≫ tensor_product.lift f, left_inv := _, right_inv := _}
Equations
- Module.category_theory.monoidal_closed = {closed' := λ (M : Module R), {is_adj := {right := (category_theory.linear_coyoneda R (Module R)).obj (opposite.op M), adj := category_theory.adjunction.mk_of_hom_equiv {hom_equiv := λ (N P : Module R), M.monoidal_closed_hom_equiv N P, hom_equiv_naturality_left_symm' := _, hom_equiv_naturality_right' := _}}}}
Describes the counit of the adjunction M ⊗ - ⊣ Hom(M, -)
. Given an R
-module N
this
should give a map M ⊗ Hom(M, N) ⟶ N
, so we flip the order of the arguments in the identity map
Hom(M, N) ⟶ (M ⟶ N)
and uncurry the resulting map M ⟶ Hom(M, N) ⟶ N.
Describes the unit of the adjunction M ⊗ - ⊣ Hom(M, -)
. Given an R
-module N
this should
define a map N ⟶ Hom(M, M ⊗ N)
, which is given by flipping the arguments in the natural
R
-bilinear map M ⟶ N ⟶ M ⊗ N
.