Documentation

Mathlib.Algebra.Module.Bimodule

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 Modules and most of their properties follow from the theory of Modules. 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 #

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.

def Subbimodule.mk {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (p : AddSubmonoid M) (hA : ∀ (a : A) {m : M}, m pa m p) (hB : ∀ (b : B) {m : M}, m pb m p) :

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
    Instances For
      @[simp]
      theorem Subbimodule.coe_mk {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (p : AddSubmonoid M) (hA : ∀ (a : A) {m : M}, m pa m p) (hB : ∀ (b : B) {m : M}, m pb m p) :
      (mk p hA hB) = p
      theorem Subbimodule.smul_mem {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (p : Submodule (TensorProduct R A B) M) (a : A) {m : M} (hm : m p) :
      a m p
      theorem Subbimodule.smul_mem' {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (p : Submodule (TensorProduct R A B) M) (b : B) {m : M} (hm : m p) :
      b m p
      def Subbimodule.baseChange {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (S : Type u_5) [CommSemiring S] [Module S M] [Algebra S A] [Algebra S B] [IsScalarTower S A M] [IsScalarTower S B M] (p : Submodule (TensorProduct R A B) M) :

      If A and B are also Algebras over yet another set of scalars S then we may "base change" from R to S.

      Equations
        Instances For
          @[simp]
          theorem Subbimodule.coe_baseChange {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (S : Type u_5) [CommSemiring S] [Module S M] [Algebra S A] [Algebra S B] [IsScalarTower S A M] [IsScalarTower S B M] (p : Submodule (TensorProduct R A B) M) :
          (baseChange S p) = p
          def Subbimodule.toSubmodule {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (p : Submodule (TensorProduct R A B) M) :

          Forgetting the B action, a Submodule over A ⊗[R] B is just a Submodule over A.

          Equations
            Instances For
              @[simp]
              theorem Subbimodule.coe_toSubmodule {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (p : Submodule (TensorProduct R A B) M) :
              (toSubmodule p) = p
              def Subbimodule.toSubmodule' {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (p : Submodule (TensorProduct R A B) M) :

              Forgetting the A action, a Submodule over A ⊗[R] B is just a Submodule over B.

              Equations
                Instances For
                  @[simp]
                  theorem Subbimodule.coe_toSubmodule' {R : Type u_1} {A : Type u_2} {B : Type u_3} {M : Type u_4} [CommSemiring R] [AddCommMonoid M] [Module R M] [Semiring A] [Semiring B] [Module A M] [Module B M] [Algebra R A] [Algebra R B] [IsScalarTower R A M] [IsScalarTower R B M] [SMulCommClass A B M] (p : Submodule (TensorProduct R A B) M) :
                  (toSubmodule' p) = p
                  def Subbimodule.toSubbimoduleInt (R : Type u_1) (S : Type u_2) (M : Type u_3) [Ring R] [Ring S] [AddCommGroup M] [Module R M] [Module S M] [SMulCommClass R S M] (p : Submodule (TensorProduct R S) M) :

                  A Submodule over R ⊗[ℕ] S is naturally also a Submodule over the canonically-isomorphic ring R ⊗[ℤ] S.

                  Equations
                    Instances For
                      @[simp]
                      theorem Subbimodule.coe_toSubbimoduleInt (R : Type u_1) (S : Type u_2) (M : Type u_3) [Ring R] [Ring S] [AddCommGroup M] [Module R M] [Module S M] [SMulCommClass R S M] (p : Submodule (TensorProduct R S) M) :
                      (toSubbimoduleInt R S M p) = p
                      def Subbimodule.toSubbimoduleNat (R : Type u_1) (S : Type u_2) (M : Type u_3) [Ring R] [Ring S] [AddCommGroup M] [Module R M] [Module S M] [SMulCommClass R S M] (p : Submodule (TensorProduct R S) M) :

                      A Submodule over R ⊗[ℤ] S is naturally also a Submodule over the canonically-isomorphic ring R ⊗[ℕ] S.

                      Equations
                        Instances For
                          @[simp]
                          theorem Subbimodule.coe_toSubbimoduleNat (R : Type u_1) (S : Type u_2) (M : Type u_3) [Ring R] [Ring S] [AddCommGroup M] [Module R M] [Module S M] [SMulCommClass R S M] (p : Submodule (TensorProduct R S) M) :
                          (toSubbimoduleNat R S M p) = p