Documentation

Mathlib.Algebra.Group.WithOne.Defs

Adjoining a zero/one to semigroups and related algebraic structures #

This file contains different results about adjoining an element to an algebraic structure which then behaves like a zero or a one. An example is adjoining a one to a semigroup to obtain a monoid. That this provides an example of an adjunction is proved in Algebra.Category.MonCat.Adjunctions.

Another result says that adjoining to a group an element zero gives a GroupWithZero. For more information about these structures (which are not that standard in informal mathematics, see Algebra.GroupWithZero.Basic)

Porting notes #

In Lean 3, we use id here and there to get correct types of proofs. This is required because WithOne and WithZero are marked as Irreducible at the end of algebra.group.with_one.defs, so proofs that use Option α instead of WithOne α no longer typecheck. In Lean 4, both types are plain defs, so we don't need these ids.

def WithZero (α : Type u_1) :
Type u_1

Add an extra element 0 to a type

Equations
Instances For
    def WithOne (α : Type u_1) :
    Type u_1

    Add an extra element 1 to a type

    Equations
    Instances For
      instance WithOne.instReprWithZero {α : Type u} [Repr α] :
      Equations
      instance WithZero.instReprWithZero {α : Type u} [Repr α] :
      Equations
      • One or more equations did not get rendered due to their size.
      abbrev WithZero.instReprWithZero.match_1 {α : Type u_1} (motive : WithZero αSort u_2) :
      (o : WithZero α) → (Unitmotive none) → ((a : α) → motive (some a)) → motive o
      Equations
      Instances For
        instance WithOne.instReprWithOne {α : Type u} [Repr α] :
        Equations
        instance WithZero.zero {α : Type u} :
        Equations
        • WithZero.zero = { zero := none }
        instance WithOne.one {α : Type u} :
        Equations
        • WithOne.one = { one := none }
        instance WithZero.add {α : Type u} [Add α] :
        Equations
        instance WithOne.mul {α : Type u} [Mul α] :
        Equations
        instance WithZero.neg {α : Type u} [Neg α] :
        Equations
        • WithZero.neg = { neg := fun a => Option.map Neg.neg a }
        instance WithOne.inv {α : Type u} [Inv α] :
        Equations
        theorem WithZero.negZeroClass.proof_1 {α : Type u_1} [Neg α] :
        -0 = -0
        instance WithZero.negZeroClass {α : Type u} [Neg α] :
        Equations
        • WithZero.negZeroClass = let src := WithZero.zero; let src_1 := WithZero.neg; NegZeroClass.mk (_ : -0 = -0)
        instance WithOne.invOneClass {α : Type u} [Inv α] :
        Equations
        instance WithZero.inhabited {α : Type u} :
        Equations
        • WithZero.inhabited = { default := 0 }
        instance WithOne.inhabited {α : Type u} :
        Equations
        • WithOne.inhabited = { default := 1 }
        instance WithZero.nontrivial {α : Type u} [Nonempty α] :
        Equations
        instance WithOne.nontrivial {α : Type u} [Nonempty α] :
        Equations
        def WithZero.coe {α : Type u} :
        αWithZero α

        The canonical map from α into WithZero α

        Equations
        • WithZero.coe = some
        Instances For
          def WithOne.coe {α : Type u} :
          αWithOne α

          The canonical map from α into WithOne α

          Equations
          • WithOne.coe = some
          Instances For
            instance WithZero.coeTC {α : Type u} :
            CoeTC α (WithZero α)
            Equations
            • WithZero.coeTC = { coe := WithZero.coe }
            instance WithOne.coeTC {α : Type u} :
            CoeTC α (WithOne α)
            Equations
            • WithOne.coeTC = { coe := WithOne.coe }
            def WithZero.recZeroCoe {α : Type u} {C : WithZero αSort u_1} (h₁ : C 0) (h₂ : (a : α) → C a) (n : WithZero α) :
            C n

            Recursor for WithZero using the preferred forms 0 and ↑a.

            Equations
            Instances For
              def WithOne.recOneCoe {α : Type u} {C : WithOne αSort u_1} (h₁ : C 1) (h₂ : (a : α) → C a) (n : WithOne α) :
              C n

              Recursor for WithOne using the preferred forms 1 and ↑a.

              Equations
              Instances For
                def WithZero.unzero {α : Type u} {x : WithZero α} (hx : x 0) :
                α

                Deconstruct an x : WithZero α to the underlying value in α, given a proof that x ≠ 0.

                Equations
                Instances For
                  def WithOne.unone {α : Type u} {x : WithOne α} (hx : x 1) :
                  α

                  Deconstruct an x : WithOne α to the underlying value in α, given a proof that x ≠ 1.

                  Equations
                  Instances For
                    @[simp]
                    theorem WithZero.unzero_coe {α : Type u} {x : α} (hx : x 0) :
                    @[simp]
                    theorem WithOne.unone_coe {α : Type u} {x : α} (hx : x 1) :
                    @[simp]
                    theorem WithZero.coe_unzero {α : Type u} {x : WithZero α} (hx : x 0) :
                    ↑(WithZero.unzero hx) = x
                    @[simp]
                    theorem WithOne.coe_unone {α : Type u} {x : WithOne α} (hx : x 1) :
                    ↑(WithOne.unone hx) = x
                    @[simp]
                    theorem WithZero.coe_ne_zero {α : Type u} {a : α} :
                    a 0
                    @[simp]
                    theorem WithOne.coe_ne_one {α : Type u} {a : α} :
                    a 1
                    @[simp]
                    theorem WithZero.zero_ne_coe {α : Type u} {a : α} :
                    0 a
                    @[simp]
                    theorem WithOne.one_ne_coe {α : Type u} {a : α} :
                    1 a
                    theorem WithZero.ne_zero_iff_exists {α : Type u} {x : WithZero α} :
                    x 0 a, a = x
                    theorem WithOne.ne_one_iff_exists {α : Type u} {x : WithOne α} :
                    x 1 a, a = x
                    instance WithZero.canLift {α : Type u} :
                    CanLift (WithZero α) α WithZero.coe fun a => a 0
                    Equations
                    theorem WithZero.canLift.proof_1 {α : Type u_1} :
                    CanLift (WithZero α) α WithZero.coe fun a => a 0
                    instance WithOne.canLift {α : Type u} :
                    CanLift (WithOne α) α WithOne.coe fun a => a 1
                    Equations
                    @[simp]
                    theorem WithZero.coe_inj {α : Type u} {a : α} {b : α} :
                    a = b a = b
                    @[simp]
                    theorem WithOne.coe_inj {α : Type u} {a : α} {b : α} :
                    a = b a = b
                    theorem WithZero.cases_on {α : Type u} {P : WithZero αProp} (x : WithZero α) :
                    P 0((a : α) → P a) → P x
                    theorem WithOne.cases_on {α : Type u} {P : WithOne αProp} (x : WithOne α) :
                    P 1((a : α) → P a) → P x
                    theorem WithZero.addZeroClass.proof_1 {α : Type u_1} [Add α] (a : Option α) :
                    Option.liftOrGet (fun x x_1 => x + x_1) none a = a
                    theorem WithZero.addZeroClass.proof_2 {α : Type u_1} [Add α] (a : Option α) :
                    Option.liftOrGet (fun x x_1 => x + x_1) a none = a
                    instance WithZero.addZeroClass {α : Type u} [Add α] :
                    Equations
                    instance WithOne.mulOneClass {α : Type u} [Mul α] :
                    Equations
                    theorem WithZero.addMonoid.proof_5 {α : Type u_1} [AddSemigroup α] :
                    ∀ (n : ) (x : WithZero α), nsmulRec (n + 1) x = nsmulRec (n + 1) x
                    theorem WithZero.addMonoid.proof_3 {α : Type u_1} [AddSemigroup α] (a : WithZero α) :
                    a + 0 = a
                    theorem WithZero.addMonoid.proof_4 {α : Type u_1} [AddSemigroup α] :
                    ∀ (x : WithZero α), nsmulRec 0 x = nsmulRec 0 x
                    theorem WithZero.addMonoid.proof_2 {α : Type u_1} [AddSemigroup α] (a : WithZero α) :
                    0 + a = a
                    theorem WithZero.addMonoid.proof_1 {α : Type u_1} [AddSemigroup α] (a : Option α) (b : Option α) (c : Option α) :
                    Option.liftOrGet (fun x x_1 => x + x_1) (Option.liftOrGet (fun x x_1 => x + x_1) a b) c = Option.liftOrGet (fun x x_1 => x + x_1) a (Option.liftOrGet (fun x x_1 => x + x_1) b c)
                    Equations
                    instance WithOne.monoid {α : Type u} [Semigroup α] :
                    Equations
                    • WithOne.monoid = let src := WithOne.mulOneClass; Monoid.mk (_ : ∀ (a : WithOne α), 1 * a = a) (_ : ∀ (a : WithOne α), a * 1 = a) npowRec
                    theorem WithZero.addCommMonoid.proof_5 {α : Type u_1} [AddCommSemigroup α] (a : Option α) (b : Option α) :
                    Option.liftOrGet (fun x x_1 => x + x_1) a b = Option.liftOrGet (fun x x_1 => x + x_1) b a
                    Equations
                    • One or more equations did not get rendered due to their size.
                    theorem WithZero.addCommMonoid.proof_2 {α : Type u_1} [AddCommSemigroup α] (a : WithZero α) :
                    a + 0 = a
                    theorem WithZero.addCommMonoid.proof_1 {α : Type u_1} [AddCommSemigroup α] (a : WithZero α) :
                    0 + a = a
                    Equations
                    @[simp]
                    theorem WithZero.coe_add {α : Type u} [Add α] (a : α) (b : α) :
                    ↑(a + b) = a + b
                    @[simp]
                    theorem WithOne.coe_mul {α : Type u} [Mul α] (a : α) (b : α) :
                    ↑(a * b) = a * b
                    @[simp]
                    theorem WithZero.coe_neg {α : Type u} [Neg α] (a : α) :
                    ↑(-a) = -a
                    @[simp]
                    theorem WithOne.coe_inv {α : Type u} [Inv α] (a : α) :
                    a⁻¹ = (a)⁻¹
                    instance WithZero.one {α : Type u} [one : One α] :
                    Equations
                    • WithZero.one = { one := One.one }
                    @[simp]
                    theorem WithZero.coe_one {α : Type u} [One α] :
                    1 = 1
                    instance WithZero.mulZeroClass {α : Type u} [Mul α] :
                    Equations
                    • One or more equations did not get rendered due to their size.
                    @[simp]
                    theorem WithZero.coe_mul {α : Type u} [Mul α] {a : α} {b : α} :
                    ↑(a * b) = a * b
                    Equations
                    Equations
                    • One or more equations did not get rendered due to their size.
                    Equations
                    instance WithZero.pow {α : Type u} [One α] [Pow α ] :
                    Equations
                    • WithZero.pow = { pow := fun x n => match x, n with | none, 0 => 1 | none, Nat.succ n => 0 | some x, n => ↑(x ^ n) }
                    @[simp]
                    theorem WithZero.coe_pow {α : Type u} [One α] [Pow α ] {a : α} (n : ) :
                    ↑(a ^ n) = a ^ n
                    Equations
                    • WithZero.monoidWithZero = let src := WithZero.mulZeroOneClass; let src_1 := WithZero.semigroupWithZero; MonoidWithZero.mk (_ : ∀ (a : WithZero α), 0 * a = 0) (_ : ∀ (a : WithZero α), a * 0 = 0)
                    Equations
                    • One or more equations did not get rendered due to their size.
                    instance WithZero.inv {α : Type u} [Inv α] :

                    Given an inverse operation on α there is an inverse operation on WithZero α sending 0 to 0.

                    Equations
                    • WithZero.inv = { inv := fun a => Option.map Inv.inv a }
                    @[simp]
                    theorem WithZero.coe_inv {α : Type u} [Inv α] (a : α) :
                    a⁻¹ = (a)⁻¹
                    @[simp]
                    theorem WithZero.inv_zero {α : Type u} [Inv α] :
                    0⁻¹ = 0
                    Equations
                    • WithZero.invOneClass = let src := WithZero.one; let src_1 := WithZero.inv; InvOneClass.mk (_ : 1⁻¹ = 1)
                    instance WithZero.div {α : Type u} [Div α] :
                    Equations
                    theorem WithZero.coe_div {α : Type u} [Div α] (a : α) (b : α) :
                    ↑(a / b) = a / b
                    instance WithZero.instPowWithZeroInt {α : Type u} [One α] [Pow α ] :
                    Equations
                    • One or more equations did not get rendered due to their size.
                    @[simp]
                    theorem WithZero.coe_zpow {α : Type u} [DivInvMonoid α] {a : α} (n : ) :
                    ↑(a ^ n) = a ^ n
                    Equations
                    • WithZero.divInvMonoid = let src := WithZero.div; let src_1 := WithZero.inv; let src_2 := WithZero.monoidWithZero; DivInvMonoid.mk fun n x => x ^ n
                    Equations
                    • WithZero.divInvOneMonoid = let src := WithZero.divInvMonoid; let src_1 := WithZero.invOneClass; DivInvOneMonoid.mk (_ : 1⁻¹ = 1)

                    if G is a group then WithZero G is a group with zero.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Equations
                    • One or more equations did not get rendered due to their size.
                    Equations
                    • WithZero.addMonoidWithOne = let src := WithZero.addMonoid; let src_1 := WithZero.one; AddMonoidWithOne.mk
                    instance WithZero.semiring {α : Type u} [Semiring α] :
                    Equations
                    • One or more equations did not get rendered due to their size.