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
Mathlib.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
Mathlib.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
Mathlib.Algebra.Group.WithOne.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.
TODO #
WithOne.coe_mul and WithZero.coe_mul have inconsistent use of implicit parameters
Equations
- WithOne.instReprWithZero = { reprPrec := fun (o : WithZero α) (x : ℕ) => match o with | none => Std.Format.text "0" | some a => Std.Format.text "↑" ++ repr a }
Equations
- WithZero.instRepr.match_1 motive o h_1 h_2 = Option.casesOn o (h_1 ()) fun (val : α) => h_2 val
Instances For
Equations
- WithOne.instRepr = { reprPrec := fun (o : WithOne α) (x : ℕ) => match o with | none => Std.Format.text "1" | some a => Std.Format.text "↑" ++ repr a }
Equations
- WithZero.add = { add := Option.liftOrGet fun (x x_1 : α) => x + x_1 }
Equations
- WithOne.mul = { mul := Option.liftOrGet fun (x x_1 : α) => x * x_1 }
Equations
- WithZero.neg = { neg := fun (a : WithZero α) => Option.map Neg.neg a }
Equations
- WithOne.inv = { inv := fun (a : WithOne α) => Option.map Inv.inv a }
Equations
- WithZero.negZeroClass = let __src := WithZero.zero; let __src_1 := WithZero.neg; NegZeroClass.mk ⋯
Equations
- WithOne.invOneClass = let __src := WithOne.one; let __src_1 := WithOne.inv; InvOneClass.mk ⋯
Recursor for WithZero using the preferred forms 0 and ↑a.
Equations
- WithZero.recZeroCoe h₁ h₂ x = WithZero.instRepr.match_1 (fun (x : WithZero α) => C x) x (fun (_ : Unit) => h₁) fun (x : α) => h₂ x
Instances For
Recursor for WithOne using the preferred forms 1 and ↑a.
Equations
- WithOne.recOneCoe h₁ h₂ x = match x with | none => h₁ | some x => h₂ x
Instances For
Deconstruct an x : WithZero α to the underlying value in α, given a proof that x ≠ 0.
Equations
- WithZero.unzero x = WithZero.unzero.match_1 (fun (x : WithZero α) (x : x ≠ 0) => α) x✝ x fun (x : α) (x_1 : ↑x ≠ 0) => x
Instances For
Deconstruct an x : WithOne α to the underlying value in α, given a proof that x ≠ 1.
Equations
- WithOne.unone x = match x✝, x with | some x, x_1 => x
Instances For
Equations
- WithZero.addZeroClass = AddZeroClass.mk ⋯ ⋯
Equations
- WithOne.mulOneClass = MulOneClass.mk ⋯ ⋯
Equations
- WithZero.addMonoid = let __spread.0 := WithZero.addZeroClass; AddMonoid.mk ⋯ ⋯ nsmulRec ⋯ ⋯
Equations
- WithZero.addCommMonoid = AddCommMonoid.mk ⋯
Equations
- WithOne.commMonoid = CommMonoid.mk ⋯