Bimodules #
One frequently encounters situations in which several sets of scalars act on a single space, subject
to compatibility condition(s). A distinguished instance of this is the theory of bimodules: one has
two rings R
, S
acting on an additive group M
, with R
acting covariantly ("on the left")
and S
acting contravariantly ("on the right"). The compatibility condition is just:
(r • m) • s = r • (m • s)
for all r : R
, s : S
, m : M
.
This situation can be set up in Mathlib as:
variable (R S M : Type*) [Ring R] [Ring S]
variable [AddCommGroup M] [Module R M] [Module Sᵐᵒᵖ M] [SMulCommClass R Sᵐᵒᵖ M]
The key fact is:
example : Module (R ⊗[ℕ] Sᵐᵒᵖ) M := TensorProduct.Algebra.module
Note that the corresponding result holds for the canonically isomorphic ring R ⊗[ℤ] Sᵐᵒᵖ
but it is
preferable to use the R ⊗[ℕ] Sᵐᵒᵖ
instance since it works without additive inverses.
Bimodules are thus just a special case of Module
s and most of their properties follow from the
theory of Module
s. In particular a two-sided Submodule of a bimodule is simply a term of type
Submodule (R ⊗[ℕ] Sᵐᵒᵖ) M
.
This file is a place to collect results which are specific to bimodules.
Main definitions #
Subbimodule.mk
Subbimodule.smul_mem
Subbimodule.smul_mem'
Subbimodule.toSubmodule
Subbimodule.toSubmodule'
Implementation details #
For many definitions and lemmas it is preferable to set things up without opposites, i.e., as:
[Module S M] [SMulCommClass R S M]
rather than [Module Sᵐᵒᵖ M] [SMulCommClass R Sᵐᵒᵖ M]
.
The corresponding results for opposites then follow automatically and do not require taking
advantage of the fact that (Sᵐᵒᵖ)ᵐᵒᵖ
is defeq to S
.
TODO #
Develop the theory of two-sided ideals, which have type Submodule (R ⊗[ℕ] Rᵐᵒᵖ) R
.
A constructor for a subbimodule which demands closure under the two sets of scalars individually, rather than jointly via their tensor product.
Note that R
plays no role but it is convenient to make this generalisation to support the cases
R = ℕ
and R = ℤ
which both show up naturally. See also Subbimodule.baseChange
.
Equations
- Subbimodule.mk p hA hB = { carrier := ↑p, add_mem' := ⋯, zero_mem' := ⋯, smul_mem' := ⋯ }
Instances For
If A
and B
are also Algebra
s over yet another set of scalars S
then we may "base change"
from R
to S
.
Equations
- Subbimodule.baseChange S p = Subbimodule.mk p.toAddSubmonoid ⋯ ⋯
Instances For
Forgetting the B
action, a Submodule
over A ⊗[R] B
is just a Submodule
over A
.
Equations
- Subbimodule.toSubmodule p = { carrier := ↑p, add_mem' := ⋯, zero_mem' := ⋯, smul_mem' := ⋯ }
Instances For
Forgetting the A
action, a Submodule
over A ⊗[R] B
is just a Submodule
over B
.
Equations
- Subbimodule.toSubmodule' p = { carrier := ↑p, add_mem' := ⋯, zero_mem' := ⋯, smul_mem' := ⋯ }
Instances For
A Submodule
over R ⊗[ℕ] S
is naturally also a Submodule
over the canonically-isomorphic
ring R ⊗[ℤ] S
.
Equations
- Subbimodule.toSubbimoduleInt R S M p = Subbimodule.baseChange ℤ p
Instances For
A Submodule
over R ⊗[ℤ] S
is naturally also a Submodule
over the canonically-isomorphic
ring R ⊗[ℕ] S
.
Equations
- Subbimodule.toSubbimoduleNat R S M p = Subbimodule.baseChange ℕ p