92 lines
2.8 KiB
Text
92 lines
2.8 KiB
Text
class Semigroup (α : Type u) extends Mul α where
|
||
mul_assoc (a b c : α) : a * b * c = a * (b * c)
|
||
|
||
class CommSemigroup (α : Type u) extends Semigroup α where
|
||
mul_comm (a b : α) : a * b = b * a
|
||
|
||
class One (α : Type u) where
|
||
one : α
|
||
|
||
instance [One α] : OfNat α (nat_lit 1) where
|
||
ofNat := One.one
|
||
|
||
class Monoid (α : Type u) extends Semigroup α, One α where
|
||
one_mul (a : α) : 1 * a = a
|
||
mul_one (a : α) : a * 1 = a
|
||
|
||
class CommMonoid (α : Type u) extends Monoid α, CommSemigroup α
|
||
|
||
set_option pp.all true
|
||
#check @CommMonoid.mk
|
||
#print CommMonoid.toCommSemigroup
|
||
|
||
class Inv (α : Type u) where
|
||
inv : α → α
|
||
|
||
postfix:100 "⁻¹" => Inv.inv
|
||
|
||
class Group (α : Type u) extends Monoid α, Inv α where
|
||
mul_left_inv (a : α) : a⁻¹ * a = 1
|
||
|
||
class CommGroup (α : Type u) extends Group α, CommMonoid α
|
||
|
||
#check @CommGroup.mk
|
||
#print CommGroup.toCommMonoid
|
||
|
||
class AddSemigroup (α : Type u) extends Add α where
|
||
add_assoc (a b c : α) : a + b + c = a + (b + c)
|
||
|
||
class AddCommSemigroup (α : Type u) extends AddSemigroup α where
|
||
add_comm (a b : α) : a + b = b + a
|
||
|
||
class Zero (α : Type u) where
|
||
zero : α
|
||
|
||
instance [Zero α] : OfNat α (nat_lit 0) where
|
||
ofNat := Zero.zero
|
||
|
||
class AddMonoid (α : Type u) extends AddSemigroup α, Zero α where
|
||
zero_add (a : α) : 0 + a = a
|
||
add_zero (a : α) : a + 0 = a
|
||
|
||
class AddCommMonoid (α : Type u) extends AddMonoid α, AddCommSemigroup α
|
||
|
||
class AddGroup (α : Type u) extends AddMonoid α, Neg α where
|
||
add_left_neg (a : α) : -a + a = 0
|
||
|
||
class AddCommGroup (α : Type u) extends AddGroup α, AddCommMonoid α
|
||
|
||
class Distrib (α : Type u) extends Mul α, Add α where
|
||
left_distrib ( a b c : α) : a * (b + c) = (a * b) + (a * c)
|
||
right_distrib (a b c : α) : (a + b) * c = (a * c) + (b * c)
|
||
|
||
class MulZero (α : Type u) extends Mul α, Zero α where
|
||
zero_mul (a : α) : 0 * a = 0
|
||
mul_zero (a : α) : a * 0 = 0
|
||
|
||
class ZeroNeOne (α : Type u) extends Zero α, One α where
|
||
zero_ne_one : (0:α) ≠ 1
|
||
|
||
class Semiring (α : Type u) extends AddCommMonoid α, Monoid α, Distrib α, MulZero α
|
||
|
||
class CommSemiring (α : Type u) extends Semiring α, CommMonoid α
|
||
|
||
class Ring (α : Type u) extends AddCommGroup α, Monoid α, Distrib α
|
||
|
||
class CommRing (α : Type u) extends Ring α, CommSemigroup α
|
||
|
||
class NoZeroDivisors (α : Type u) extends Mul α, Zero α where
|
||
eq_zero_or_eq_zero_of_mul_eq_zero (a b : α) : a * b = 0 → a = 0 ∨ b = 0
|
||
|
||
class IntegralDomain (α : Type u) extends CommRing α, NoZeroDivisors α, ZeroNeOne α
|
||
|
||
class DivisionRing (α : Type u) extends Ring α, Inv α, ZeroNeOne α where
|
||
mul_inv_cancel {a : α} : a ≠ 0 → a * a⁻¹ = 1
|
||
inv_mul_cancel {a : α} : a ≠ 0 → a⁻¹ * a = 1
|
||
|
||
class Field (α : Type u) extends DivisionRing α, CommRing α
|
||
|
||
set_option pp.all false in
|
||
#check @Field.mk
|
||
#print Field.toDivisionRing
|
||
#print Field.toCommRing
|