@@ -49,10 +49,24 @@ class ordered_add_comm_monoid (α : Type*) extends add_comm_monoid α, partial_o
49
49
50
50
attribute [to_additive] ordered_comm_monoid
51
51
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 α :=
56
70
(lt_of_mul_lt_mul_left := λ x y z, by {
57
71
apply imp_of_not_imp_not,
58
72
intro h,
@@ -63,6 +77,29 @@ class linear_ordered_comm_monoid_with_zero (α : Type*)
63
77
letI : linear_order α := by refine { le := le, lt := lt, lt_iff_le_not_le := _, .. }; assumption,
64
78
exact le_of_not_lt h })
65
79
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
66
103
67
104
section ordered_comm_monoid
68
105
variables [ordered_comm_monoid α] {a b c d : α}
@@ -299,6 +336,17 @@ end mono
299
336
300
337
end ordered_comm_monoid
301
338
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
+
302
350
lemma bit0_pos [ordered_add_comm_monoid α] {a : α} (h : 0 < a) : 0 < bit0 a :=
303
351
add_pos h h
304
352
@@ -552,6 +600,14 @@ instance [ordered_add_comm_monoid α] : ordered_add_comm_monoid (with_top α) :=
552
600
end ,
553
601
..with_top.partial_order, ..with_top.add_comm_monoid }
554
602
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
+
555
611
/-- Coercion from `α` to `with_top α` as an `add_monoid_hom`. -/
556
612
def coe_add_hom [add_monoid α] : α →+ with_top α :=
557
613
⟨coe, rfl, λ _ _, rfl⟩
@@ -1076,16 +1132,16 @@ fn_min_mul_fn_max id n m
1076
1132
/-- A linearly ordered cancellative additive commutative monoid
1077
1133
is an additive commutative monoid with a decidable linear order
1078
1134
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 ]
1080
1136
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 α
1082
1138
1083
1139
/-- A linearly ordered cancellative commutative monoid
1084
1140
is a commutative monoid with a linear order
1085
1141
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]
1087
1143
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 α
1089
1145
1090
1146
section linear_ordered_cancel_comm_monoid
1091
1147
@@ -1126,7 +1182,7 @@ def function.injective.linear_ordered_cancel_comm_monoid {β : Type*}
1126
1182
(f : β → α) (hf : function.injective f) (one : f 1 = 1 )
1127
1183
(mul : ∀ x y, f (x * y) = f x * f y) :
1128
1184
linear_ordered_cancel_comm_monoid β :=
1129
- { ..linear_order.lift f hf ,
1185
+ { ..hf.linear_ordered_comm_monoid f one mul ,
1130
1186
..hf.ordered_cancel_comm_monoid f one mul }
1131
1187
1132
1188
end linear_ordered_cancel_comm_monoid
@@ -1203,4 +1259,12 @@ instance [ordered_cancel_comm_monoid α] : ordered_cancel_add_comm_monoid (addit
1203
1259
..additive.add_left_cancel_semigroup,
1204
1260
..additive.ordered_add_comm_monoid }
1205
1261
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
+
1206
1270
end type_tags
0 commit comments