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

Commit cbcbe24

Browse files
feat(algebra/ordered_monoid): linear_ordered_add_comm_monoid(_with_top) (#6520)
Separates out classes for `linear_ordered_(add_)comm_monoid` Creates `linear_ordered_add_comm_monoid_with_top`, an additive and order-reversed version of `linear_ordered_comm_monoid_with_zero`. Puts an instance of `linear_ordered_add_comm_monoid_with_top` on `with_top` of any `linear_ordered_add_comm_monoid` and also on `enat` Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
1 parent 626cb42 commit cbcbe24

File tree

7 files changed

+123
-10
lines changed

7 files changed

+123
-10
lines changed

src/algebra/group/type_tags.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,12 @@ end multiplicative
6565
instance [inhabited α] : inhabited (additive α) := ⟨additive.of_mul (default α)⟩
6666
instance [inhabited α] : inhabited (multiplicative α) := ⟨multiplicative.of_add (default α)⟩
6767

68+
instance [nontrivial α] : nontrivial (additive α) :=
69+
additive.of_mul.injective.nontrivial
70+
71+
instance [nontrivial α] : nontrivial (multiplicative α) :=
72+
multiplicative.of_add.injective.nontrivial
73+
6874
instance additive.has_add [has_mul α] : has_add (additive α) :=
6975
{ add := λ x y, additive.of_mul (x.to_mul * y.to_mul) }
7076

src/algebra/linear_ordered_comm_group_with_zero.lean

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ class linear_ordered_comm_group_with_zero (α : Type*)
3535
variables {α : Type*}
3636
variables {a b c d x y z : α}
3737

38+
instance [linear_ordered_add_comm_monoid_with_top α] :
39+
linear_ordered_comm_monoid_with_zero (multiplicative (order_dual α)) :=
40+
{ zero := multiplicative.of_add (⊤ : α),
41+
zero_mul := top_add,
42+
mul_zero := add_top,
43+
zero_le_one := (le_top : (0 : α) ≤ ⊤),
44+
..multiplicative.ordered_comm_monoid,
45+
..multiplicative.linear_order }
46+
3847
section linear_ordered_comm_monoid
3948

4049
variables [linear_ordered_comm_monoid_with_zero α]
@@ -123,6 +132,13 @@ lemma zero_lt_iff : 0 < a ↔ a ≠ 0 :=
123132
lemma ne_zero_of_lt (h : b < a) : a ≠ 0 :=
124133
λ h1, not_lt_zero' $ show b < 0, from h1 ▸ h
125134

135+
instance : linear_ordered_add_comm_monoid_with_top (additive (order_dual α)) :=
136+
{ top := (0 : α),
137+
top_add' := λ a, (zero_mul a : (0 : α) * a = 0),
138+
le_top := λ _, zero_le',
139+
..additive.ordered_add_comm_monoid,
140+
..additive.linear_order }
141+
126142
end linear_ordered_comm_monoid
127143

128144
variables [linear_ordered_comm_group_with_zero α]

src/algebra/module/submodule.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,12 @@ instance to_ordered_add_comm_monoid
209209
ordered_add_comm_monoid S :=
210210
subtype.coe_injective.ordered_add_comm_monoid coe rfl (λ _ _, rfl)
211211

212+
/-- A submodule of a `linear_ordered_add_comm_monoid` is a `linear_ordered_add_comm_monoid`. -/
213+
instance to_linear_ordered_add_comm_monoid
214+
{M} [linear_ordered_add_comm_monoid M] [semimodule R M] (S : submodule R M) :
215+
linear_ordered_add_comm_monoid S :=
216+
subtype.coe_injective.linear_ordered_add_comm_monoid coe rfl (λ _ _, rfl)
217+
212218
/-- A submodule of an `ordered_cancel_add_comm_monoid` is an `ordered_cancel_add_comm_monoid`. -/
213219
instance to_ordered_cancel_add_comm_monoid
214220
{M} [ordered_cancel_add_comm_monoid M] [semimodule R M] (S : submodule R M) :

src/algebra/ordered_group.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -942,4 +942,12 @@ instance [ordered_comm_group α] : ordered_add_comm_group (additive α) :=
942942
{ ..additive.add_comm_group,
943943
..additive.ordered_add_comm_monoid }
944944

945+
instance [linear_ordered_add_comm_group α] : linear_ordered_comm_group (multiplicative α) :=
946+
{ ..multiplicative.linear_order,
947+
..multiplicative.ordered_comm_group }
948+
949+
instance [linear_ordered_comm_group α] : linear_ordered_add_comm_group (additive α) :=
950+
{ ..additive.linear_order,
951+
..additive.ordered_add_comm_group }
952+
945953
end type_tags

src/algebra/ordered_monoid.lean

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,24 @@ class ordered_add_comm_monoid (α : Type*) extends add_comm_monoid α, partial_o
4949

5050
attribute [to_additive] ordered_comm_monoid
5151

52-
/-- A linearly ordered commutative monoid with a zero element. -/
53-
class linear_ordered_comm_monoid_with_zero (α : Type*)
54-
extends linear_order α, comm_monoid_with_zero α, ordered_comm_monoid α :=
55-
(zero_le_one : (0:α) ≤ 1)
52+
/-- A linearly ordered additive commutative monoid. -/
53+
@[protect_proj, ancestor linear_order ordered_add_comm_monoid]
54+
class linear_ordered_add_comm_monoid (α : Type*)
55+
extends linear_order α, ordered_add_comm_monoid α :=
56+
(lt_of_add_lt_add_left := λ x y z, by {
57+
apply imp_of_not_imp_not,
58+
intro h,
59+
apply not_lt_of_le,
60+
apply add_le_add_left,
61+
-- type-class inference uses `a : linear_order α` which it can't unfold, unless we provide this!
62+
-- `lt_iff_le_not_le` gets filled incorrectly with `autoparam` if we don't provide that field.
63+
letI : linear_order α := by refine { le := le, lt := lt, lt_iff_le_not_le := _, .. }; assumption,
64+
exact le_of_not_lt h })
65+
66+
/-- A linearly ordered commutative monoid. -/
67+
@[protect_proj, ancestor linear_order ordered_comm_monoid, to_additive]
68+
class linear_ordered_comm_monoid (α : Type*)
69+
extends linear_order α, ordered_comm_monoid α :=
5670
(lt_of_mul_lt_mul_left := λ x y z, by {
5771
apply imp_of_not_imp_not,
5872
intro h,
@@ -63,6 +77,29 @@ class linear_ordered_comm_monoid_with_zero (α : Type*)
6377
letI : linear_order α := by refine { le := le, lt := lt, lt_iff_le_not_le := _, .. }; assumption,
6478
exact le_of_not_lt h })
6579

80+
/-- A linearly ordered commutative monoid with a zero element. -/
81+
class linear_ordered_comm_monoid_with_zero (α : Type*)
82+
extends linear_ordered_comm_monoid α, comm_monoid_with_zero α :=
83+
(zero_le_one : (0 : α) ≤ 1)
84+
85+
/-- A linearly ordered commutative monoid with an additively absorbing `⊤` element.
86+
Instances should include number systems with an infinite element adjoined.` -/
87+
@[protect_proj, ancestor linear_ordered_add_comm_monoid order_top]
88+
class linear_ordered_add_comm_monoid_with_top (α : Type*)
89+
extends linear_ordered_add_comm_monoid α, order_top α :=
90+
(top_add' : ∀ x : α, ⊤ + x = ⊤)
91+
92+
section linear_ordered_add_comm_monoid_with_top
93+
variables [linear_ordered_add_comm_monoid_with_top α] {a b : α}
94+
95+
@[simp]
96+
lemma top_add (a : α) : ⊤ + a = ⊤ := linear_ordered_add_comm_monoid_with_top.top_add' a
97+
98+
@[simp]
99+
lemma add_top (a : α) : a + ⊤ = ⊤ :=
100+
by rw [add_comm, top_add]
101+
102+
end linear_ordered_add_comm_monoid_with_top
66103

67104
section ordered_comm_monoid
68105
variables [ordered_comm_monoid α] {a b c d : α}
@@ -299,6 +336,17 @@ end mono
299336

300337
end ordered_comm_monoid
301338

339+
/-- Pullback a `linear_ordered_comm_monoid` under an injective map. -/
340+
@[to_additive function.injective.linear_ordered_add_comm_monoid
341+
"Pullback an `ordered_add_comm_monoid` under an injective map."]
342+
def function.injective.linear_ordered_comm_monoid [linear_ordered_comm_monoid α] {β : Type*}
343+
[has_one β] [has_mul β]
344+
(f : β → α) (hf : function.injective f) (one : f 1 = 1)
345+
(mul : ∀ x y, f (x * y) = f x * f y) :
346+
linear_ordered_comm_monoid β :=
347+
{ .. hf.ordered_comm_monoid f one mul,
348+
.. linear_order.lift f hf }
349+
302350
lemma bit0_pos [ordered_add_comm_monoid α] {a : α} (h : 0 < a) : 0 < bit0 a :=
303351
add_pos h h
304352

@@ -552,6 +600,14 @@ instance [ordered_add_comm_monoid α] : ordered_add_comm_monoid (with_top α) :=
552600
end,
553601
..with_top.partial_order, ..with_top.add_comm_monoid }
554602

603+
instance [linear_ordered_add_comm_monoid α] :
604+
linear_ordered_add_comm_monoid_with_top (with_top α) :=
605+
{ top_add' := λ x, with_top.top_add,
606+
..with_top.order_top,
607+
..with_top.linear_order,
608+
..with_top.ordered_add_comm_monoid,
609+
..option.nontrivial }
610+
555611
/-- Coercion from `α` to `with_top α` as an `add_monoid_hom`. -/
556612
def coe_add_hom [add_monoid α] : α →+ with_top α :=
557613
⟨coe, rfl, λ _ _, rfl⟩
@@ -1076,16 +1132,16 @@ fn_min_mul_fn_max id n m
10761132
/-- A linearly ordered cancellative additive commutative monoid
10771133
is an additive commutative monoid with a decidable linear order
10781134
in which addition is cancellative and monotone. -/
1079-
@[protect_proj, ancestor ordered_cancel_add_comm_monoid linear_order]
1135+
@[protect_proj, ancestor ordered_cancel_add_comm_monoid linear_ordered_add_comm_monoid]
10801136
class linear_ordered_cancel_add_comm_monoid (α : Type u)
1081-
extends ordered_cancel_add_comm_monoid α, linear_order α
1137+
extends ordered_cancel_add_comm_monoid α, linear_ordered_add_comm_monoid α
10821138

10831139
/-- A linearly ordered cancellative commutative monoid
10841140
is a commutative monoid with a linear order
10851141
in which multiplication is cancellative and monotone. -/
1086-
@[protect_proj, ancestor ordered_cancel_comm_monoid linear_order, to_additive]
1142+
@[protect_proj, ancestor ordered_cancel_comm_monoid linear_ordered_comm_monoid, to_additive]
10871143
class linear_ordered_cancel_comm_monoid (α : Type u)
1088-
extends ordered_cancel_comm_monoid α, linear_order α
1144+
extends ordered_cancel_comm_monoid α, linear_ordered_comm_monoid α
10891145

10901146
section linear_ordered_cancel_comm_monoid
10911147

@@ -1126,7 +1182,7 @@ def function.injective.linear_ordered_cancel_comm_monoid {β : Type*}
11261182
(f : β → α) (hf : function.injective f) (one : f 1 = 1)
11271183
(mul : ∀ x y, f (x * y) = f x * f y) :
11281184
linear_ordered_cancel_comm_monoid β :=
1129-
{ ..linear_order.lift f hf,
1185+
{ ..hf.linear_ordered_comm_monoid f one mul,
11301186
..hf.ordered_cancel_comm_monoid f one mul }
11311187

11321188
end linear_ordered_cancel_comm_monoid
@@ -1203,4 +1259,12 @@ instance [ordered_cancel_comm_monoid α] : ordered_cancel_add_comm_monoid (addit
12031259
..additive.add_left_cancel_semigroup,
12041260
..additive.ordered_add_comm_monoid }
12051261

1262+
instance [linear_ordered_add_comm_monoid α] : linear_ordered_comm_monoid (multiplicative α) :=
1263+
{ ..multiplicative.linear_order,
1264+
..multiplicative.ordered_comm_monoid }
1265+
1266+
instance [linear_ordered_comm_monoid α] : linear_ordered_add_comm_monoid (additive α) :=
1267+
{ ..additive.linear_order,
1268+
..additive.ordered_add_comm_monoid }
1269+
12061270
end type_tags

src/data/nat/enat.lean

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,4 +493,10 @@ lemma find_eq_top_iff : find P = ⊤ ↔ ∀ n, ¬P n :=
493493

494494
end find
495495

496+
noncomputable instance : linear_ordered_add_comm_monoid_with_top enat :=
497+
{ top_add' := top_add,
498+
.. enat.linear_order,
499+
.. enat.ordered_add_comm_monoid,
500+
.. enat.order_top }
501+
496502
end enat

src/group_theory/submonoid/operations.lean

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -332,13 +332,20 @@ an `add_comm_monoid`."]
332332
instance to_comm_monoid {M} [comm_monoid M] (S : submonoid M) : comm_monoid S :=
333333
S.coe_injective.comm_monoid coe rfl (λ _ _, rfl)
334334

335-
/-- A submonoid of a `ordered_comm_monoid` is a `ordered_comm_monoid`. -/
335+
/-- A submonoid of an `ordered_comm_monoid` is an `ordered_comm_monoid`. -/
336336
@[to_additive "An `add_submonoid` of an `ordered_add_comm_monoid` is
337337
an `ordered_add_comm_monoid`."]
338338
instance to_ordered_comm_monoid {M} [ordered_comm_monoid M] (S : submonoid M) :
339339
ordered_comm_monoid S :=
340340
S.coe_injective.ordered_comm_monoid coe rfl (λ _ _, rfl)
341341

342+
/-- A submonoid of a `linear_ordered_comm_monoid` is a `linear_ordered_comm_monoid`. -/
343+
@[to_additive "An `add_submonoid` of a `linear_ordered_add_comm_monoid` is
344+
a `linear_ordered_add_comm_monoid`."]
345+
instance to_linear_ordered_comm_monoid {M} [linear_ordered_comm_monoid M] (S : submonoid M) :
346+
linear_ordered_comm_monoid S :=
347+
S.coe_injective.linear_ordered_comm_monoid coe rfl (λ _ _, rfl)
348+
342349
/-- A submonoid of an `ordered_cancel_comm_monoid` is an `ordered_cancel_comm_monoid`. -/
343350
@[to_additive "An `add_submonoid` of an `ordered_cancel_add_comm_monoid` is
344351
an `ordered_cancel_add_comm_monoid`."]

0 commit comments

Comments
 (0)