Documentation

Mathlib.Algebra.Module.Submodule.Lattice

The lattice structure on Submodules #

This file defines the lattice structure on submodules, Submodule.CompleteLattice, with ⊄ defined as {0} and āŠ“ defined as intersection of the underlying carrier. If p and q are submodules of a module, p ≤ q means that p āŠ† q.

Implementation notes #

This structure should match the AddSubmonoid.CompleteLattice structure, and we should try to unify the APIs where possible.

Bottom element of a submodule #

@[implicit_reducible]
instance Submodule.instBot {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :

The set {0} is the bottom element of the lattice of submodules.

@[implicit_reducible]
instance Submodule.inhabited' {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
Inhabited (Submodule R M)
@[simp]
theorem Submodule.bot_coe {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
ā†‘āŠ„ = {0}
@[simp]
theorem Submodule.mem_bot (R : Type u_1) {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {x : M} :
x ∈ ⊄ ↔ x = 0
@[simp]
theorem Submodule.mk_eq_bot {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (carrier : AddSubmonoid M) (smul_mem' : āˆ€ (c : R) {x : M}, x ∈ carrier.carrier → c • x ∈ carrier.carrier) :
{ toAddSubmonoid := carrier, smul_mem' := smul_mem' } = ⊄ ↔ carrier = ⊄
@[implicit_reducible]
instance Submodule.uniqueBot {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
@[implicit_reducible]
instance Submodule.instOrderBot {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
theorem Submodule.eq_bot_iff {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (p : Submodule R M) :
p = ⊄ ↔ āˆ€ x ∈ p, x = 0
theorem Submodule.bot_ext {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (x y : ā†„āŠ„) :
x = y
theorem Submodule.bot_ext_iff {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {x y : ā†„āŠ„} :
x = y ↔ True
theorem Submodule.ne_bot_iff {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (p : Submodule R M) :
p ≠ ⊄ ↔ ∃ x ∈ p, x ≠ 0
theorem Submodule.nonzero_mem_of_bot_lt {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p : Submodule R M} (bot_lt : ⊄ < p) :
∃ (a : ↄp), a ≠ 0
theorem Submodule.exists_mem_ne_zero_of_ne_bot {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p : Submodule R M} (h : p ≠ ⊄) :
∃ b ∈ p, b ≠ 0
def Submodule.botEquivPUnit {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
ā†„āŠ„ ā‰ƒā‚—[R] PUnit.{v + 1}

The bottom submodule is linearly equivalent to punit as an R-module.

Instances For
    @[simp]
    theorem Submodule.botEquivPUnit_symm_apply {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (xāœ : PUnit.{v + 1}) :
    botEquivPUnit.symm xāœ = 0
    @[simp]
    theorem Submodule.botEquivPUnit_apply {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (xāœ : ā†„āŠ„) :
    botEquivPUnit xāœ = PUnit.unit
    theorem Submodule.subsingleton_iff_eq_bot {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p : Submodule R M} :
    Subsingleton ↄp ↔ p = ⊄
    theorem Submodule.eq_bot_of_subsingleton {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p : Submodule R M} [Subsingleton ↄp] :
    theorem Submodule.nontrivial_iff_ne_bot {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p : Submodule R M} :
    Nontrivial ↄp ↔ p ≠ ⊄

    Top element of a submodule #

    @[implicit_reducible]
    instance Submodule.instTop {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :

    The universal set is the top element of the lattice of submodules.

    @[simp]
    theorem Submodule.top_coe {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
    @[simp]
    theorem Submodule.coe_eq_univ {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p : Submodule R M} :
    ↑p = Set.univ ↔ p = ⊤
    @[simp]
    theorem Submodule.mem_top {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {x : M} :
    x ∈ ⊤
    @[simp]
    theorem Submodule.toAddSubgroup_eq_top {R : Type u_4} {M : Type u_5} [Ring R] [AddCommGroup M] [Module R M] {p : Submodule R M} :
    p.toAddSubgroup = ⊤ ↔ p = ⊤
    @[simp]
    theorem Submodule.mk_eq_top {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (carrier : AddSubmonoid M) (smul_mem' : āˆ€ (c : R) {x : M}, x ∈ carrier.carrier → c • x ∈ carrier.carrier) :
    { toAddSubmonoid := carrier, smul_mem' := smul_mem' } = ⊤ ↔ carrier = ⊤
    @[implicit_reducible]
    instance Submodule.instOrderTop {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
    theorem Submodule.eq_top_iff' {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p : Submodule R M} :
    p = ⊤ ↔ āˆ€ (x : M), x ∈ p
    def Submodule.topEquiv {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :

    The top submodule is linearly equivalent to the module.

    This is the module version of AddSubmonoid.topEquiv.

    Instances For
      @[simp]
      theorem Submodule.topEquiv_apply {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (x : ā†„āŠ¤) :
      topEquiv x = ↑x
      @[simp]
      theorem Submodule.topEquiv_symm_apply_coe {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (x : M) :
      ↑(topEquiv.symm x) = x

      Infima & suprema in a submodule #

      @[implicit_reducible]
      instance Submodule.instInfSet {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
      theorem Submodule.isGLB_sInf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {S : Set (Submodule R M)} :
      IsGLB S (sInf S)
      @[implicit_reducible]
      instance Submodule.instMin {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
      Min (Submodule R M)
      @[implicit_reducible]
      instance Submodule.completeLattice {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
      @[simp]
      theorem Submodule.coe_inf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p q : Submodule R M} :
      ↑(p āŠ“ q) = ↑p ∩ ↑q
      @[simp]
      theorem Submodule.mem_inf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p q : Submodule R M} {x : M} :
      x ∈ p āŠ“ q ↔ x ∈ p ∧ x ∈ q
      @[simp]
      theorem Submodule.coe_sInf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] (P : Set (Submodule R M)) :
      ↑(sInf P) = ā‹‚ p ∈ P, ↑p
      @[simp]
      theorem Submodule.coe_finsetInf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {ι : Type u_4} (s : Finset ι) (p : ι → Submodule R M) :
      ↑(s.inf p) = ā‹‚ i ∈ s, ↑(p i)
      @[simp]
      theorem Submodule.coe_iInf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {ι : Sort u_4} (p : ι → Submodule R M) :
      ↑(⨅ (i : ι), p i) = ā‹‚ (i : ι), ↑(p i)
      @[simp]
      theorem Submodule.mem_sInf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {S : Set (Submodule R M)} {x : M} :
      x ∈ sInf S ↔ āˆ€ p ∈ S, x ∈ p
      @[simp]
      theorem Submodule.mem_iInf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {ι : Sort u_4} (p : ι → Submodule R M) {x : M} :
      x ∈ ⨅ (i : ι), p i ↔ āˆ€ (i : ι), x ∈ p i
      @[simp]
      theorem Submodule.mem_finsetInf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {ι : Type u_4} {s : Finset ι} {p : ι → Submodule R M} {x : M} :
      x ∈ s.inf p ↔ āˆ€ i ∈ s, x ∈ p i
      theorem Submodule.inf_iInf {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {ι : Sort u_4} [Nonempty ι] {p : ι → Submodule R M} (q : Submodule R M) :
      q āŠ“ ⨅ (i : ι), p i = ⨅ (i : ι), q āŠ“ p i
      theorem Submodule.mem_sup_left {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {S T : Submodule R M} {x : M} :
      x ∈ S → x ∈ S āŠ” T
      theorem Submodule.mem_sup_right {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {S T : Submodule R M} {x : M} :
      x ∈ T → x ∈ S āŠ” T
      theorem Submodule.add_mem_sup {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {S T : Submodule R M} {s t : M} (hs : s ∈ S) (ht : t ∈ T) :
      s + t ∈ S āŠ” T
      theorem Submodule.sub_mem_sup {R' : Type u_4} {M' : Type u_5} [Ring R'] [AddCommGroup M'] [Module R' M'] {S T : Submodule R' M'} {s t : M'} (hs : s ∈ S) (ht : t ∈ T) :
      s - t ∈ S āŠ” T
      theorem Submodule.mem_iSup_of_mem {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {ι : Sort u_4} {b : M} {p : ι → Submodule R M} (i : ι) (h : b ∈ p i) :
      b ∈ ⨆ (i : ι), p i
      theorem Submodule.sum_mem_iSup {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {ι : Type u_4} [Fintype ι] {f : ι → M} {p : ι → Submodule R M} (h : āˆ€ (i : ι), f i ∈ p i) :
      āˆ‘ i : ι, f i ∈ ⨆ (i : ι), p i
      theorem Submodule.sum_mem_biSup {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {ι : Type u_4} {s : Finset ι} {f : ι → M} {p : ι → Submodule R M} (h : āˆ€ i ∈ s, f i ∈ p i) :
      āˆ‘ i ∈ s, f i ∈ ⨆ i ∈ s, p i

      Note that Submodule.mem_iSup is provided in Mathlib/LinearAlgebra/Span/Defs.lean.

      theorem Submodule.mem_sSup_of_mem {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {S : Set (Submodule R M)} {s : Submodule R M} (hs : s ∈ S) {x : M} :
      x ∈ s → x ∈ sSup S
      @[simp]
      theorem Submodule.subsingleton_iff (R : Type u_1) {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
      Subsingleton (Submodule R M) ↔ Subsingleton M
      @[simp]
      theorem Submodule.nontrivial_iff (R : Type u_1) {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] :
      @[implicit_reducible]
      instance Submodule.instUniqueOfSubsingleton {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] [Subsingleton M] :
      @[implicit_reducible]
      instance Submodule.unique' {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] [Subsingleton R] :

      Disjointness of submodules #

      theorem Submodule.disjoint_def {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p p' : Submodule R M} :
      Disjoint p p' ↔ āˆ€ x ∈ p, x ∈ p' → x = 0
      theorem Submodule.disjoint_def' {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p p' : Submodule R M} :
      Disjoint p p' ↔ āˆ€ x ∈ p, āˆ€ y ∈ p', x = y → x = 0
      theorem Submodule.eq_zero_of_coe_mem_of_disjoint {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p q : Submodule R M} (hpq : Disjoint p q) {a : ↄp} (ha : ↑a ∈ q) :
      a = 0
      theorem Submodule.mem_right_iff_eq_zero_of_disjoint {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p p' : Submodule R M} (h : Disjoint p p') {x : ↄp} :
      ↑x ∈ p' ↔ x = 0
      theorem Submodule.mem_left_iff_eq_zero_of_disjoint {R : Type u_1} {M : Type u_3} [Semiring R] [AddCommMonoid M] [Module R M] {p p' : Submodule R M} (h : Disjoint p p') {x : ↄp'} :
      ↑x ∈ p ↔ x = 0
      theorem Submodule.disjoint_iff_add_eq_zero {M : Type u_4} {R : Type u_5} [Ring R] [AddCommGroup M] [Module R M] {N₁ Nā‚‚ : Submodule R M} :
      Disjoint N₁ Nā‚‚ ↔ āˆ€ {x y : M}, x ∈ N₁ → y ∈ Nā‚‚ → x + y = 0 → x = 0 ∧ y = 0

      Version of AddSubgroup.disjoint_iff_add_eq_zero for submodules.

      ā„•-submodules #

      An additive submonoid is equivalent to a ā„•-submodule.

      Instances For
        @[simp]
        theorem AddSubmonoid.coe_toNatSubmodule {M : Type u_3} [AddCommMonoid M] (S : AddSubmonoid M) :
        ↑(toNatSubmodule S) = ↑S

        ℤ-submodules #

        An additive subgroup is equivalent to a ℤ-submodule.

        Instances For
          @[simp]
          theorem AddSubgroup.coe_toIntSubmodule {M : Type u_3} [AddCommGroup M] (S : AddSubgroup M) :
          ↑(toIntSubmodule S) = ↑S