# 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

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

Add an extra element 1 to a type

Instances For
instance WithOne.instReprWithZero {α : Type u} [Repr α] :
Repr ()
instance WithZero.instReprWithZero {α : Type u} [Repr α] :
Repr ()
abbrev WithZero.instReprWithZero.match_1 {α : Type u_1} (motive : Sort u_2) :
(o : ) → (Unitmotive none) → ((a : α) → motive (some a)) → motive o
Instances For
instance WithOne.instReprWithOne {α : Type u} [Repr α] :
Repr ()
instance WithZero.zero {α : Type u} :
Zero ()
instance WithOne.one {α : Type u} :
One ()
instance WithOne.mul {α : Type u} [Mul α] :
Mul ()
instance WithZero.neg {α : Type u} [Neg α] :
Neg ()
instance WithOne.inv {α : Type u} [Inv α] :
Inv ()
theorem WithZero.negZeroClass.proof_1 {α : Type u_1} [Neg α] :
-0 = -0
instance WithZero.negZeroClass {α : Type u} [Neg α] :
instance WithOne.invOneClass {α : Type u} [Inv α] :
instance WithZero.inhabited {α : Type u} :
instance WithOne.inhabited {α : Type u} :
instance WithZero.nontrivial {α : Type u} [] :
instance WithOne.nontrivial {α : Type u} [] :
def WithZero.coe {α : Type u} :
α

The canonical map from α into WithZero α

Instances For
def WithOne.coe {α : Type u} :
α

The canonical map from α into WithOne α

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

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

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

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

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

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

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

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

Instances For
@[simp]
theorem WithZero.unzero_coe {α : Type u} {x : α} (hx : x 0) :
= x
@[simp]
theorem WithOne.unone_coe {α : Type u} {x : α} (hx : x 1) :
= x
@[simp]
theorem WithZero.coe_unzero {α : Type u} {x : } (hx : x 0) :
↑() = x
@[simp]
theorem WithOne.coe_unone {α : Type u} {x : } (hx : x 1) :
↑() = 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 : } :
x 0 a, a = x
theorem WithOne.ne_one_iff_exists {α : Type u} {x : } :
x 1 a, a = x
instance WithZero.canLift {α : Type u} :
CanLift () α WithZero.coe fun a => a 0
theorem WithZero.canLift.proof_1 {α : Type u_1} :
CanLift () α WithZero.coe fun a => a 0
instance WithOne.canLift {α : Type u} :
CanLift () α WithOne.coe fun a => a 1
@[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 : Prop} (x : ) :
P 0((a : α) → P a) → P x
theorem WithOne.cases_on {α : Type u} {P : Prop} (x : ) :
P 1((a : α) → P a) → P x
theorem WithZero.addZeroClass.proof_1 {α : Type u_1} [Add α] (a : ) :
Option.liftOrGet (fun x x_1 => x + x_1) none a = a
theorem WithZero.addZeroClass.proof_2 {α : Type u_1} [Add α] (a : ) :
Option.liftOrGet (fun x x_1 => x + x_1) a none = a
instance WithOne.mulOneClass {α : Type u} [Mul α] :
theorem WithZero.addMonoid.proof_5 {α : Type u_1} [] :
∀ (n : ) (x : ), nsmulRec (n + 1) x = nsmulRec (n + 1) x
theorem WithZero.addMonoid.proof_3 {α : Type u_1} [] (a : ) :
a + 0 = a
theorem WithZero.addMonoid.proof_4 {α : Type u_1} [] :
∀ (x : ), nsmulRec 0 x = nsmulRec 0 x
theorem WithZero.addMonoid.proof_2 {α : Type u_1} [] (a : ) :
0 + a = a
theorem WithZero.addMonoid.proof_1 {α : Type u_1} [] (a : ) (b : ) (c : ) :
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)
instance WithZero.addMonoid {α : Type u} [] :
instance WithOne.monoid {α : Type u} [] :
theorem WithZero.addCommMonoid.proof_5 {α : Type u_1} [] (a : ) (b : ) :
Option.liftOrGet (fun x x_1 => x + x_1) a b = Option.liftOrGet (fun x x_1 => x + x_1) b a
instance WithZero.addCommMonoid {α : Type u} [] :
theorem WithZero.addCommMonoid.proof_2 {α : Type u_1} [] (a : ) :
a + 0 = a
theorem WithZero.addCommMonoid.proof_4 {α : Type u_1} [] (n : ) (x : ) :
AddMonoid.nsmul (n + 1) x = x +
theorem WithZero.addCommMonoid.proof_3 {α : Type u_1} [] (x : ) :
= 0
theorem WithZero.addCommMonoid.proof_1 {α : Type u_1} [] (a : ) :
0 + a = a
instance WithOne.commMonoid {α : Type u} [] :
@[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 α] :
One ()
@[simp]
theorem WithZero.coe_one {α : Type u} [One α] :
1 = 1
instance WithZero.mulZeroClass {α : Type u} [Mul α] :
@[simp]
theorem WithZero.coe_mul {α : Type u} [Mul α] {a : α} {b : α} :
↑(a * b) = a * b
instance WithZero.noZeroDivisors {α : Type u} [Mul α] :
instance WithZero.semigroupWithZero {α : Type u} [] :
instance WithZero.commSemigroup {α : Type u} [] :
instance WithZero.mulZeroOneClass {α : Type u} [] :
instance WithZero.pow {α : Type u} [One α] [Pow α ] :
Pow ()
@[simp]
theorem WithZero.coe_pow {α : Type u} [One α] [Pow α ] {a : α} (n : ) :
↑(a ^ n) = a ^ n
instance WithZero.monoidWithZero {α : Type u} [] :
instance WithZero.inv {α : Type u} [Inv α] :
Inv ()

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

@[simp]
theorem WithZero.coe_inv {α : Type u} [Inv α] (a : α) :
a⁻¹ = (a)⁻¹
@[simp]
theorem WithZero.inv_zero {α : Type u} [Inv α] :
0⁻¹ = 0
instance WithZero.invOneClass {α : Type u} [] :
instance WithZero.div {α : Type u} [Div α] :
Div ()
theorem WithZero.coe_div {α : Type u} [Div α] (a : α) (b : α) :
↑(a / b) = a / b
instance WithZero.instPowWithZeroInt {α : Type u} [One α] [Pow α ] :
Pow ()
@[simp]
theorem WithZero.coe_zpow {α : Type u} [] {a : α} (n : ) :
↑(a ^ n) = a ^ n
instance WithZero.divInvMonoid {α : Type u} [] :
instance WithZero.divInvOneMonoid {α : Type u} [] :
instance WithZero.groupWithZero {α : Type u} [] :

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

instance WithZero.commGroupWithZero {α : Type u} [] :
instance WithZero.addMonoidWithOne {α : Type u} [] :
instance WithZero.semiring {α : Type u} [] :