Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit ef7aa94

Browse files
ocfnashgebnerkim-emeric-wieser
committed
feat(algebra/ring/basic): define non-unital, non-associative rings (#6786)
This introduces the following typeclasses beneath `semiring`: * `non_unital_non_assoc_semiring` * `non_unital_semiring` * `non_assoc_semiring` The goal is to use these to support a non-unital, non-associative algebras. The typeclass requirements of `subring`, `subsemiring`, and `ring_hom` are relaxed from `semiring` to `non_assoc_semiring`. Instances of these new typeclasses are added for: * alias types: * `opposite` * `ulift` * convolutive types: * `(add_)monoid_algebra` * `direct_sum` * `set_semiring` * `hahn_series` * elementwise types: * `locally_constant` * `pi` * `prod` * `finsupp` Co-authored-by: Gabriel Ebner <gebner@gebner.org> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
1 parent 1eb3ae4 commit ef7aa94

File tree

28 files changed

+420
-208
lines changed

28 files changed

+420
-208
lines changed

src/algebra/algebra/basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1330,7 +1330,7 @@ instance algebra {r : comm_semiring R}
13301330
algebra R (Π i : I, f i) :=
13311331
{ commutes' := λ a f, begin ext, simp [algebra.commutes], end,
13321332
smul_def' := λ a f, begin ext, simp [algebra.smul_def''], end,
1333-
..pi.ring_hom (λ i, algebra_map R (f i)) }
1333+
..(pi.ring_hom (λ i, algebra_map R (f i)) : R →+* Π i : I, f i) }
13341334

13351335
@[simp] lemma algebra_map_apply {r : comm_semiring R}
13361336
[s : ∀ i, semiring (f i)] [∀ i, algebra R (f i)] (a : R) (i : I) :

src/algebra/big_operators/ring.lean

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,19 @@ variables {s s₁ s₂ : finset α} {a : α} {b : β} {f g : α → β}
2626

2727

2828
section semiring
29-
variables [semiring β]
29+
variables [non_unital_non_assoc_semiring β]
3030

3131
lemma sum_mul : (∑ x in s, f x) * b = ∑ x in s, f x * b :=
3232
(s.sum_hom (λ x, x * b)).symm
3333

3434
lemma mul_sum : b * (∑ x in s, f x) = ∑ x in s, b * f x :=
3535
(s.sum_hom _).symm
3636

37+
end semiring
38+
39+
section semiring
40+
variables [non_assoc_semiring β]
41+
3742
lemma sum_mul_boole [decidable_eq α] (s : finset α) (f : α → β) (a : α) :
3843
(∑ x in s, (f x * ite (a = x) 1 0)) = ite (a ∈ s) (f a) 0 :=
3944
by simp

src/algebra/category/CommRing/basic.lean

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,15 @@ def SemiRing : Type (u+1) := bundled semiring
2626

2727
namespace SemiRing
2828

29-
instance bundled_hom : bundled_hom @ring_hom :=
30-
⟨@ring_hom.to_fun, @ring_hom.id, @ring_hom.comp, @ring_hom.coe_inj⟩
29+
/-- `ring_hom` doesn't actually assume associativity. This alias is needed to make the category
30+
theory machinery work. We use the same trick in `category_theory.Mon.assoc_monoid_hom`. -/
31+
abbreviation assoc_ring_hom (M N : Type*) [semiring M] [semiring N] := ring_hom M N
32+
33+
instance bundled_hom : bundled_hom assoc_ring_hom :=
34+
⟨λ M N [semiring M] [semiring N], by exactI @ring_hom.to_fun M N _ _,
35+
λ M [semiring M], by exactI @ring_hom.id M _,
36+
λ M N P [semiring M] [semiring N] [semiring P], by exactI @ring_hom.comp M N P _ _ _,
37+
λ M N [semiring M] [semiring N], by exactI @ring_hom.coe_inj M N _ _⟩
3138

3239
attribute [derive [has_coe_to_sort, large_category, concrete_category]] SemiRing
3340

src/algebra/char_p/pi.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ instance pi (ι : Type u) [hi : nonempty ι] (R : Type v) [semiring R] (p : ℕ)
2020
⟨λ x, let ⟨i⟩ := hi in iff.symm $ (char_p.cast_eq_zero_iff R p x).symm.trans
2121
⟨λ h, funext $ λ j, show pi.eval_ring_hom (λ _, R) j (↑x : ι → R) = 0,
2222
by rw [ring_hom.map_nat_cast, h],
23-
λ h, (pi.eval_ring_hom (λ _, R) i).map_nat_cast x ▸ by rw [h, ring_hom.map_zero]⟩⟩
23+
λ h, (pi.eval_ring_hom (λ _: ι, R) i).map_nat_cast x ▸ by rw [h, ring_hom.map_zero]⟩⟩
2424

2525
-- diamonds
2626
instance pi' (ι : Type u) [hi : nonempty ι] (R : Type v) [comm_ring R] (p : ℕ) [char_p R p] :

src/algebra/direct_sum_graded.lean

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ additively-graded ring. The typeclasses are:
2323
Respectively, these imbue the direct sum `⨁ i, A i` with:
2424
2525
* `direct_sum.has_one`
26-
* `direct_sum.mul_zero_class`, `direct_sum.distrib`
26+
* `direct_sum.non_unital_non_assoc_semiring`
2727
* `direct_sum.semiring`, `direct_sum.ring`
2828
* `direct_sum.comm_semiring`, `direct_sum.comm_ring`
2929
3030
the base ring `A 0` with:
3131
3232
* `direct_sum.grade_zero.has_one`
33-
* `direct_sum.grade_zero.mul_zero_class`, `direct_sum.grade_zero.distrib`
33+
* `direct_sum.grade_zero.non_unital_non_assoc_semiring`
3434
* `direct_sum.grade_zero.semiring`, `direct_sum.grade_zero.ring`
3535
* `direct_sum.grade_zero.comm_semiring`, `direct_sum.grade_zero.comm_ring`
3636
@@ -86,7 +86,7 @@ variables (A : ι → Type*)
8686
class ghas_one [has_zero ι] :=
8787
(one : A 0)
8888

89-
/-- A graded version of `has_mul` that also subsumes `distrib` and `mul_zero_class` by requiring
89+
/-- A graded version of `has_mul` that also subsumes `non_unital_non_assoc_semiring` by requiring
9090
the multiplication be an `add_monoid_hom`. Multiplication combines grades additively, like
9191
`add_monoid_algebra`. -/
9292
class ghas_mul [has_add ι] [Π i, add_comm_monoid (A i)] :=
@@ -302,20 +302,15 @@ direct_sum.to_add_monoid $ λ i,
302302
add_monoid_hom.flip $ direct_sum.to_add_monoid $ λ j, add_monoid_hom.flip $
303303
(direct_sum.of A _).comp_hom.comp ghas_mul.mul
304304

305-
instance : has_mul (⨁ i, A i) :=
306-
{ mul := λ a b, mul_hom A a b }
307-
308-
instance : mul_zero_class (⨁ i, A i) :=
309-
{ mul := (*),
305+
instance : non_unital_non_assoc_semiring (⨁ i, A i) :=
306+
{ mul := λ a b, mul_hom A a b,
310307
zero := 0,
311-
zero_mul := λ a, by { unfold has_mul.mul, simp only [map_zero, add_monoid_hom.zero_apply]},
312-
mul_zero := λ a, by { unfold has_mul.mul, simp only [map_zero] } }
313-
314-
instance : distrib (⨁ i, A i) :=
315-
{ mul := (*),
316308
add := (+),
317-
left_distrib := λ a b c, by { unfold has_mul.mul, simp only [map_add]},
318-
right_distrib := λ a b c, by { unfold has_mul.mul, simp only [map_add, add_monoid_hom.add_apply]}}
309+
zero_mul := λ a, by simp only [map_zero, add_monoid_hom.zero_apply],
310+
mul_zero := λ a, by simp only [map_zero],
311+
left_distrib := λ a b c, by simp only [map_add],
312+
right_distrib := λ a b c, by simp only [map_add, add_monoid_hom.add_apply],
313+
.. direct_sum.add_comm_monoid _ _}
319314

320315
variables {A}
321316

@@ -379,9 +374,7 @@ instance semiring : semiring (⨁ i, A i) := {
379374
one_mul := one_mul A,
380375
mul_one := mul_one A,
381376
mul_assoc := mul_assoc A,
382-
..direct_sum.mul_zero_class A,
383-
..direct_sum.distrib A,
384-
..direct_sum.add_comm_monoid _ _, }
377+
..direct_sum.non_unital_non_assoc_semiring _, }
385378

386379
end semiring
387380

@@ -490,13 +483,9 @@ end
490483
@[simp] lemma of_zero_mul (a b : A 0) : of _ 0 (a * b) = of _ 0 a * of _ 0 b:=
491484
of_zero_smul A a b
492485

493-
instance grade_zero.mul_zero_class : mul_zero_class (A 0) :=
494-
function.injective.mul_zero_class (of A 0) dfinsupp.single_injective
495-
(of A 0).map_zero (of_zero_mul A)
496-
497-
instance grade_zero.distrib : distrib (A 0) :=
498-
function.injective.distrib (of A 0) dfinsupp.single_injective
499-
(of A 0).map_add (of_zero_mul A)
486+
instance grade_zero.non_unital_non_assoc_semiring : non_unital_non_assoc_semiring (A 0) :=
487+
function.injective.non_unital_non_assoc_semiring (of A 0) dfinsupp.single_injective
488+
(of A 0).map_zero (of A 0).map_add (of_zero_mul A)
500489

501490
instance grade_zero.smul_with_zero (i : ι) : smul_with_zero (A 0) (A i) :=
502491
begin

src/algebra/monoid_algebra.lean

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -76,34 +76,33 @@ lemma mul_def {f g : monoid_algebra k G} :
7676
f * g = (f.sum $ λa₁ b₁, g.sum $ λa₂ b₂, single (a₁ * a₂) (b₁ * b₂)) :=
7777
rfl
7878

79-
instance : distrib (monoid_algebra k G) :=
80-
{ mul := (*),
79+
instance : non_unital_non_assoc_semiring (monoid_algebra k G) :=
80+
{ zero := 0,
81+
mul := (*),
8182
add := (+),
8283
left_distrib := assume f g h, by simp only [mul_def, sum_add_index, mul_add, mul_zero,
8384
single_zero, single_add, eq_self_iff_true, forall_true_iff, forall_3_true_iff, sum_add],
8485
right_distrib := assume f g h, by simp only [mul_def, sum_add_index, add_mul, mul_zero, zero_mul,
8586
single_zero, single_add, eq_self_iff_true, forall_true_iff, forall_3_true_iff, sum_zero,
8687
sum_add],
87-
.. finsupp.add_comm_monoid }
88-
89-
instance : mul_zero_class (monoid_algebra k G) :=
90-
{ zero := 0,
91-
mul := (*),
9288
zero_mul := assume f, by simp only [mul_def, sum_zero_index],
93-
mul_zero := assume f, by simp only [mul_def, sum_zero_index, sum_zero] }
89+
mul_zero := assume f, by simp only [mul_def, sum_zero_index, sum_zero],
90+
.. finsupp.add_comm_monoid }
9491

9592
end has_mul
9693

9794
section semigroup
9895

9996
variables [semiring k] [semigroup G]
10097

101-
instance : semigroup_with_zero (monoid_algebra k G) :=
102-
{ mul := (*),
98+
instance : non_unital_semiring (monoid_algebra k G) :=
99+
{ zero := 0,
100+
mul := (*),
101+
add := (+),
103102
mul_assoc := assume f g h, by simp only [mul_def, sum_sum_index, sum_zero_index, sum_add_index,
104103
sum_single_index, single_zero, single_add, eq_self_iff_true, forall_true_iff, forall_3_true_iff,
105104
add_mul, mul_add, add_assoc, mul_assoc, zero_mul, mul_zero, sum_zero, sum_add],
106-
.. monoid_algebra.mul_zero_class }
105+
.. monoid_algebra.non_unital_non_assoc_semiring}
107106

108107
end semigroup
109108

@@ -125,14 +124,16 @@ section mul_one_class
125124

126125
variables [semiring k] [mul_one_class G]
127126

128-
instance : mul_zero_one_class (monoid_algebra k G) :=
127+
instance : non_assoc_semiring (monoid_algebra k G) :=
129128
{ one := 1,
130129
mul := (*),
130+
zero := 0,
131+
add := (+),
131132
one_mul := assume f, by simp only [mul_def, one_def, sum_single_index, zero_mul,
132133
single_zero, sum_zero, zero_add, one_mul, sum_single],
133134
mul_one := assume f, by simp only [mul_def, one_def, sum_single_index, mul_zero,
134135
single_zero, sum_zero, add_zero, mul_one, sum_single],
135-
..monoid_algebra.mul_zero_class }
136+
..monoid_algebra.non_unital_non_assoc_semiring }
136137

137138
variables {R : Type*} [semiring R]
138139

@@ -175,10 +176,8 @@ instance : semiring (monoid_algebra k G) :=
175176
mul := (*),
176177
zero := 0,
177178
add := (+),
178-
.. monoid_algebra.mul_zero_one_class,
179-
.. monoid_algebra.semigroup_with_zero,
180-
.. monoid_algebra.distrib,
181-
.. finsupp.add_comm_monoid }
179+
.. monoid_algebra.non_unital_semiring,
180+
.. monoid_algebra.non_assoc_semiring }
182181

183182
variables {R : Type*} [semiring R]
184183

@@ -658,20 +657,21 @@ lemma mul_def {f g : add_monoid_algebra k G} :
658657
f * g = (f.sum $ λa₁ b₁, g.sum $ λa₂ b₂, single (a₁ + a₂) (b₁ * b₂)) :=
659658
rfl
660659

661-
instance : distrib (add_monoid_algebra k G) :=
662-
{ mul := (*),
660+
instance : non_unital_non_assoc_semiring (add_monoid_algebra k G) :=
661+
{ zero := 0,
662+
mul := (*),
663663
add := (+),
664664
left_distrib := assume f g h, by simp only [mul_def, sum_add_index, mul_add, mul_zero,
665665
single_zero, single_add, eq_self_iff_true, forall_true_iff, forall_3_true_iff, sum_add],
666666
right_distrib := assume f g h, by simp only [mul_def, sum_add_index, add_mul, mul_zero, zero_mul,
667667
single_zero, single_add, eq_self_iff_true, forall_true_iff, forall_3_true_iff, sum_zero,
668-
sum_add], }
669-
670-
instance : mul_zero_class (add_monoid_algebra k G) :=
671-
{ zero := 0,
672-
mul := (*),
668+
sum_add],
673669
zero_mul := assume f, by simp only [mul_def, sum_zero_index],
674-
mul_zero := assume f, by simp only [mul_def, sum_zero_index, sum_zero] }
670+
mul_zero := assume f, by simp only [mul_def, sum_zero_index, sum_zero],
671+
nsmul := λ n f, n • f,
672+
nsmul_zero' := by { intros, ext, simp [-nsmul_eq_mul, add_smul] },
673+
nsmul_succ' := by { intros, ext, simp [-nsmul_eq_mul, nat.succ_eq_one_add, add_smul] },
674+
.. finsupp.add_comm_monoid }
675675

676676
end has_mul
677677

@@ -693,27 +693,31 @@ section semigroup
693693

694694
variables [semiring k] [add_semigroup G]
695695

696-
instance : semigroup_with_zero (add_monoid_algebra k G) :=
697-
{ mul := (*),
696+
instance : non_unital_semiring (add_monoid_algebra k G) :=
697+
{ zero := 0,
698+
mul := (*),
699+
add := (+),
698700
mul_assoc := assume f g h, by simp only [mul_def, sum_sum_index, sum_zero_index, sum_add_index,
699701
sum_single_index, single_zero, single_add, eq_self_iff_true, forall_true_iff, forall_3_true_iff,
700702
add_mul, mul_add, add_assoc, mul_assoc, zero_mul, mul_zero, sum_zero, sum_add],
701-
.. add_monoid_algebra.mul_zero_class }
703+
.. add_monoid_algebra.non_unital_non_assoc_semiring }
702704

703705
end semigroup
704706

705707
section mul_one_class
706708

707709
variables [semiring k] [add_zero_class G]
708710

709-
instance : mul_zero_one_class (add_monoid_algebra k G) :=
711+
instance : non_assoc_semiring (add_monoid_algebra k G) :=
710712
{ one := 1,
711713
mul := (*),
714+
zero := 0,
715+
add := (+),
712716
one_mul := assume f, by simp only [mul_def, one_def, sum_single_index, zero_mul,
713717
single_zero, sum_zero, zero_add, one_mul, sum_single],
714718
mul_one := assume f, by simp only [mul_def, one_def, sum_single_index, mul_zero,
715719
single_zero, sum_zero, add_zero, mul_one, sum_single],
716-
.. add_monoid_algebra.mul_zero_class }
720+
.. add_monoid_algebra.non_unital_non_assoc_semiring }
717721

718722
variables {R : Type*} [semiring R]
719723

@@ -755,13 +759,8 @@ instance : semiring (add_monoid_algebra k G) :=
755759
mul := (*),
756760
zero := 0,
757761
add := (+),
758-
nsmul := λ n f, n • f,
759-
nsmul_zero' := by { intros, ext, simp [-nsmul_eq_mul, add_smul] },
760-
nsmul_succ' := by { intros, ext, simp [-nsmul_eq_mul, nat.succ_eq_one_add, add_smul] },
761-
.. add_monoid_algebra.mul_zero_one_class,
762-
.. add_monoid_algebra.semigroup_with_zero,
763-
.. add_monoid_algebra.distrib,
764-
.. finsupp.add_comm_monoid }
762+
.. add_monoid_algebra.non_unital_semiring,
763+
.. add_monoid_algebra.non_assoc_semiring, }
765764

766765
variables {R : Type*} [semiring R]
767766

src/algebra/opposites.lean

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,23 @@ instance [mul_zero_class α] : mul_zero_class (opposite α) :=
153153
instance [mul_zero_one_class α] : mul_zero_one_class (opposite α) :=
154154
{ .. opposite.mul_zero_class α, .. opposite.mul_one_class α }
155155

156+
instance [semigroup_with_zero α] : semigroup_with_zero (opposite α) :=
157+
{ .. opposite.semigroup α, .. opposite.mul_zero_class α }
158+
156159
instance [monoid_with_zero α] : monoid_with_zero (opposite α) :=
157160
{ .. opposite.monoid α, .. opposite.mul_zero_one_class α }
158161

162+
instance [non_unital_non_assoc_semiring α] : non_unital_non_assoc_semiring (opposite α) :=
163+
{ .. opposite.add_comm_monoid α, .. opposite.mul_zero_class α, .. opposite.distrib α }
164+
165+
instance [non_unital_semiring α] : non_unital_semiring (opposite α) :=
166+
{ .. opposite.semigroup_with_zero α, .. opposite.non_unital_non_assoc_semiring α }
167+
168+
instance [non_assoc_semiring α] : non_assoc_semiring (opposite α) :=
169+
{ .. opposite.mul_zero_one_class α, .. opposite.non_unital_non_assoc_semiring α }
170+
159171
instance [semiring α] : semiring (opposite α) :=
160-
{ .. opposite.add_comm_monoid α, .. opposite.monoid_with_zero α, .. opposite.distrib α }
172+
{ .. opposite.non_unital_semiring α, .. opposite.non_assoc_semiring α }
161173

162174
instance [ring α] : ring (opposite α) :=
163175
{ .. opposite.add_comm_group α, .. opposite.monoid α, .. opposite.semiring α }

src/algebra/pointwise.lean

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -346,27 +346,22 @@ instance set_semiring.add_comm_monoid : add_comm_monoid (set_semiring α) :=
346346
add_zero := union_empty,
347347
add_comm := union_comm, }
348348

349-
instance set_semiring.mul_zero_class [has_mul α] : mul_zero_class (set_semiring α) :=
349+
instance set_semiring.non_unital_non_assoc_semiring [has_mul α] :
350+
non_unital_non_assoc_semiring (set_semiring α) :=
350351
{ zero_mul := λ s, empty_mul,
351352
mul_zero := λ s, mul_empty,
352-
..set.has_mul, ..set_semiring.add_comm_monoid }
353-
354-
instance set_semiring.distrib [has_mul α] : distrib (set_semiring α) :=
355-
{ left_distrib := λ _ _ _, mul_union,
353+
left_distrib := λ _ _ _, mul_union,
356354
right_distrib := λ _ _ _, union_mul,
357355
..set.has_mul, ..set_semiring.add_comm_monoid }
358356

359-
instance set_semiring.mul_zero_one_class [mul_one_class α] : mul_zero_one_class (set_semiring α) :=
360-
{ ..set_semiring.mul_zero_class, ..set.mul_one_class }
357+
instance set_semiring.non_assoc_semiring [mul_one_class α] : non_assoc_semiring (set_semiring α) :=
358+
{ ..set_semiring.non_unital_non_assoc_semiring, ..set.mul_one_class }
361359

362-
instance set_semiring.semigroup_with_zero [semigroup α] : semigroup_with_zero (set_semiring α) :=
363-
{ ..set_semiring.mul_zero_class, ..set.semigroup }
360+
instance set_semiring.non_unital_semiring [semigroup α] : non_unital_semiring (set_semiring α) :=
361+
{ ..set_semiring.non_unital_non_assoc_semiring, ..set.semigroup }
364362

365363
instance set_semiring.semiring [monoid α] : semiring (set_semiring α) :=
366-
{ ..set_semiring.add_comm_monoid,
367-
..set_semiring.distrib,
368-
..set_semiring.mul_zero_class,
369-
..set.monoid }
364+
{ ..set_semiring.non_assoc_semiring, ..set_semiring.non_unital_semiring }
370365

371366
instance set_semiring.comm_semiring [comm_monoid α] : comm_semiring (set_semiring α) :=
372367
{ ..set.comm_monoid, ..set_semiring.semiring }

0 commit comments

Comments
 (0)