@@ -4,10 +4,11 @@ Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Floris van Doorn
5
5
6
6
! This file was ported from Lean 3 source module data.set.semiring
7
- ! leanprover-community/mathlib commit 9003f28797c0664a49e4179487267c494477d853
7
+ ! leanprover-community/mathlib commit 27b54c47c3137250a521aa64e9f1db90be5f6a26
8
8
! Please do not edit these lines, except to modify the commit id
9
9
! if you have ported upstream changes.
10
10
-/
11
+ import Mathlib.Algebra.Order.Kleene
11
12
import Mathlib.Data.Set.Pointwise.SMul
12
13
13
14
/-!
@@ -53,6 +54,10 @@ protected def down : SetSemiring α ≃ Set α :=
53
54
Equiv.refl _
54
55
#align set_semiring.down SetSemiring.down
55
56
57
+ --Porting note: new, since dot notation doesn't work
58
+ open SetSemiring (down)
59
+ open Set (up)
60
+
56
61
--Porting note: dot notation no longer works
57
62
@[simp]
58
63
protected theorem down_up (s : Set α) : SetSemiring.down (Set.up s) = s :=
@@ -97,6 +102,34 @@ instance : AddCommMonoid (SetSemiring α) where
97
102
add_zero := union_empty
98
103
add_comm := union_comm
99
104
105
+ theorem zero_def : (0 : SetSemiring α) = Set.up ∅ :=
106
+ rfl
107
+ #align set_semiring.zero_def SetSemiring.zero_def
108
+
109
+ @[simp]
110
+ theorem down_zero : down (0 : SetSemiring α) = ∅ :=
111
+ rfl
112
+ #align set_semiring.down_zero SetSemiring.down_zero
113
+
114
+ @[simp]
115
+ theorem _root_.Set.up_empty : Set.up (∅ : Set α) = 0 :=
116
+ rfl
117
+ #align set.up_empty Set.up_empty
118
+
119
+ theorem add_def (s t : SetSemiring α) : s + t = up (down s ∪ down t) :=
120
+ rfl
121
+ #align set_semiring.add_def SetSemiring.add_def
122
+
123
+ @[simp]
124
+ theorem down_add (s t : SetSemiring α) : down (s + t) = down s ∪ down t :=
125
+ rfl
126
+ #align set_semiring.down_add SetSemiring.down_add
127
+
128
+ @[simp]
129
+ theorem _root_.Set.up_union (s t : Set α) : up (s ∪ t) = up s + up t :=
130
+ rfl
131
+ #align set.up_union Set.up_union
132
+
100
133
/- Since addition on `SetSemiring` is commutative (it is set union), there is no need
101
134
to also have the instance `CovariantClass (SetSemiring α) (SetSemiring α) (swap (+)) (≤)`. -/
102
135
instance covariantClass_add : CovariantClass (SetSemiring α) (SetSemiring α) (· + ·) (· ≤ ·) :=
@@ -116,6 +149,21 @@ instance : NonUnitalNonAssocSemiring (SetSemiring α) :=
116
149
left_distrib := fun _ _ _ => mul_union
117
150
right_distrib := fun _ _ _ => union_mul }
118
151
152
+ -- TODO: port
153
+ theorem mul_def (s t : SetSemiring α) : s * t = up (down s * down t) :=
154
+ rfl
155
+ #align set_semiring.mul_def SetSemiring.mul_def
156
+
157
+ @[simp]
158
+ theorem down_mul (s t : SetSemiring α) : down (s * t) = down s * down t :=
159
+ rfl
160
+ #align set_semiring.down_mul SetSemiring.down_mul
161
+
162
+ @[simp]
163
+ theorem _root_.Set.up_mul (s t : Set α) : up (s * t) = up s * up t :=
164
+ rfl
165
+ #align set.up_mul Set.up_mul
166
+
119
167
instance : NoZeroDivisors (SetSemiring α) :=
120
168
⟨fun {a b} ab =>
121
169
a.eq_empty_or_nonempty.imp_right fun ha =>
@@ -134,23 +182,51 @@ instance covariantClass_mul_right :
134
182
135
183
end Mul
136
184
137
- -- Porting note: this was `one := 1`
185
+
186
+ section One
187
+
188
+ variable [One α]
189
+
190
+ -- porting note: noncomputable?
191
+ noncomputable instance : One (SetSemiring α) where one := Set.up (1 : Set α)
192
+
193
+ theorem one_def : (1 : SetSemiring α) = Set.up 1 :=
194
+ rfl
195
+ #align set_semiring.one_def SetSemiring.one_def
196
+
197
+ @[simp]
198
+ theorem down_one : down (1 : SetSemiring α) = 1 :=
199
+ rfl
200
+ #align set_semiring.down_one SetSemiring.down_one
201
+
202
+ @[simp]
203
+ theorem _root_.Set.up_one : up (1 : Set α) = 1 :=
204
+ rfl
205
+ #align set.up_one Set.up_one
206
+
207
+ end One
208
+
138
209
instance [MulOneClass α] : NonAssocSemiring (SetSemiring α) :=
139
210
{ (inferInstance : NonUnitalNonAssocSemiring (SetSemiring α)),
140
211
Set.mulOneClass with
141
- one := Set.up ({ 1 } : Set α)
212
+ one := 1
142
213
mul := (· * ·) }
143
214
144
215
instance [Semigroup α] : NonUnitalSemiring (SetSemiring α) :=
145
216
{ (inferInstance : NonUnitalNonAssocSemiring (SetSemiring α)), Set.semigroup with }
146
217
147
- instance [Monoid α] : Semiring (SetSemiring α) :=
218
+ instance [Monoid α] : IdemSemiring (SetSemiring α) :=
148
219
{ (inferInstance : NonAssocSemiring (SetSemiring α)),
149
- (inferInstance : NonUnitalSemiring (SetSemiring α)) with }
220
+ (inferInstance : NonUnitalSemiring (SetSemiring α)),
221
+ (inferInstance : CompleteBooleanAlgebra (Set α)) with }
150
222
151
223
instance [CommSemigroup α] : NonUnitalCommSemiring (SetSemiring α) :=
152
224
{ (inferInstance : NonUnitalSemiring (SetSemiring α)), Set.commSemigroup with }
153
225
226
+ instance [CommMonoid α] : IdemCommSemiring (SetSemiring α) :=
227
+ { (inferInstance : IdemSemiring (SetSemiring α)),
228
+ (inferInstance : CommMonoid (Set α)) with }
229
+
154
230
instance [CommMonoid α] : CommMonoid (SetSemiring α) :=
155
231
{ (inferInstance : Monoid (SetSemiring α)), Set.commSemigroup with }
156
232
@@ -166,11 +242,30 @@ instance [CommMonoid α] : CanonicallyOrderedCommSemiring (SetSemiring α) :=
166
242
with respect to the pointwise operations on sets. -/
167
243
def imageHom [MulOneClass α] [MulOneClass β] (f : α →* β) : SetSemiring α →+* SetSemiring β
168
244
where
169
- toFun := image f
245
+ toFun s := up ( image f (down s))
170
246
map_zero' := image_empty _
171
- map_one' := by rw [image_one, map_one, singleton_one]
247
+ map_one' := by
248
+ dsimp only -- porting note: structures do not do this automatically any more
249
+ rw [down_one, image_one, map_one, singleton_one, up_one]
172
250
map_add' := image_union _
173
251
map_mul' _ _ := image_mul f
174
252
#align set_semiring.image_hom SetSemiring.imageHom
175
253
254
+ lemma imageHom_def [MulOneClass α] [MulOneClass β] (f : α →* β) (s : SetSemiring α) :
255
+ imageHom f s = up (image f (down s)) :=
256
+ rfl
257
+ #align set_semiring.image_hom_def SetSemiring.imageHom_def
258
+
259
+ @[simp]
260
+ lemma down_imageHom [MulOneClass α] [MulOneClass β] (f : α →* β) (s : SetSemiring α) :
261
+ down (imageHom f s) = f '' down s :=
262
+ rfl
263
+ #align set_semiring.down_image_hom SetSemiring.down_imageHom
264
+
265
+ @[simp]
266
+ lemma _root_.Set.up_image [MulOneClass α] [MulOneClass β] (f : α →* β) (s : Set α) :
267
+ up (f '' s) = imageHom f (up s) :=
268
+ rfl
269
+ #align set.up_image Set.up_image
270
+
176
271
end SetSemiring
0 commit comments