9
9
10
10
module Algebra.Construct.Flip.Op where
11
11
12
- open import Algebra
13
- import Data.Product.Base as Product
14
- import Data.Sum.Base as Sum
12
+ open import Algebra.Core
13
+ open import Algebra.Bundles
14
+ import Algebra.Definitions as Def
15
+ import Algebra.Structures as Str
16
+ import Algebra.Consequences.Setoid as Consequences
17
+ import Data.Product as Prod
18
+ import Data.Sum as Sum
15
19
open import Function.Base using (flip)
16
20
open import Level using (Level)
17
21
open import Relation.Binary.Core using (Rel; _Preserves₂_⟶_⟶_)
@@ -33,136 +37,270 @@ preserves₂ : (∼ ≈ ≋ : Rel A ℓ) →
33
37
∙ Preserves₂ ∼ ⟶ ≈ ⟶ ≋ → (flip ∙) Preserves₂ ≈ ⟶ ∼ ⟶ ≋
34
38
preserves₂ _ _ _ pres = flip pres
35
39
36
- module _ (≈ : Rel A ℓ) (∙ : Op₂ A) where
40
+ module ∙-Properties (≈ : Rel A ℓ) (∙ : Op₂ A) where
37
41
38
- associative : Symmetric ≈ → Associative ≈ ∙ → Associative ≈ (flip ∙)
42
+ open Def ≈
43
+
44
+ associative : Symmetric ≈ → Associative ∙ → Associative (flip ∙)
39
45
associative sym assoc x y z = sym (assoc z y x)
40
46
41
- identity : Identity ≈ ε ∙ → Identity ≈ ε (flip ∙)
42
- identity id = Product .swap id
47
+ identity : Identity ε ∙ → Identity ε (flip ∙)
48
+ identity id = Prod .swap id
43
49
44
- commutative : Commutative ≈ ∙ → Commutative ≈ (flip ∙)
50
+ commutative : Commutative ∙ → Commutative (flip ∙)
45
51
commutative comm = flip comm
46
52
47
- selective : Selective ≈ ∙ → Selective ≈ (flip ∙)
53
+ selective : Selective ∙ → Selective (flip ∙)
48
54
selective sel x y = Sum.swap (sel y x)
49
55
50
- idempotent : Idempotent ≈ ∙ → Idempotent ≈ (flip ∙)
56
+ idempotent : Idempotent ∙ → Idempotent (flip ∙)
51
57
idempotent idem = idem
52
58
53
- inverse : Inverse ≈ ε ⁻¹ ∙ → Inverse ≈ ε ⁻¹ (flip ∙)
54
- inverse inv = Product.swap inv
59
+ inverse : Inverse ε ⁻¹ ∙ → Inverse ε ⁻¹ (flip ∙)
60
+ inverse inv = Prod.swap inv
61
+
62
+ zero : Zero ε ∙ → Zero ε (flip ∙)
63
+ zero zer = Prod.swap zer
64
+
65
+ module *-Properties (≈ : Rel A ℓ) (* + : Op₂ A) where
66
+
67
+ open Def ≈
68
+
69
+ distributes : * DistributesOver + → (flip *) DistributesOver +
70
+ distributes distrib = Prod.swap distrib
55
71
56
72
------------------------------------------------------------------------
57
73
-- Structures
58
74
59
75
module _ {≈ : Rel A ℓ} {∙ : Op₂ A} where
60
76
61
- isMagma : IsMagma ≈ ∙ → IsMagma ≈ (flip ∙)
77
+ open Def ≈
78
+ open Str ≈
79
+ open ∙-Properties ≈ ∙
80
+
81
+ isMagma : IsMagma ∙ → IsMagma (flip ∙)
62
82
isMagma m = record
63
83
{ isEquivalence = isEquivalence
64
84
; ∙-cong = preserves₂ ≈ ≈ ≈ ∙-cong
65
85
}
66
86
where open IsMagma m
67
87
68
- isSelectiveMagma : IsSelectiveMagma ≈ ∙ → IsSelectiveMagma ≈ (flip ∙)
88
+ isSelectiveMagma : IsSelectiveMagma ∙ → IsSelectiveMagma (flip ∙)
69
89
isSelectiveMagma m = record
70
90
{ isMagma = isMagma m.isMagma
71
- ; sel = selective ≈ ∙ m.sel
91
+ ; sel = selective m.sel
72
92
}
73
93
where module m = IsSelectiveMagma m
74
94
75
- isCommutativeMagma : IsCommutativeMagma ≈ ∙ → IsCommutativeMagma ≈ (flip ∙)
95
+ isCommutativeMagma : IsCommutativeMagma ∙ → IsCommutativeMagma (flip ∙)
76
96
isCommutativeMagma m = record
77
97
{ isMagma = isMagma m.isMagma
78
- ; comm = commutative ≈ ∙ m.comm
98
+ ; comm = commutative m.comm
79
99
}
80
100
where module m = IsCommutativeMagma m
81
101
82
- isSemigroup : IsSemigroup ≈ ∙ → IsSemigroup ≈ (flip ∙)
102
+ isSemigroup : IsSemigroup ∙ → IsSemigroup (flip ∙)
83
103
isSemigroup s = record
84
104
{ isMagma = isMagma s.isMagma
85
- ; assoc = associative ≈ ∙ s.sym s.assoc
105
+ ; assoc = associative s.sym s.assoc
86
106
}
87
107
where module s = IsSemigroup s
88
108
89
- isBand : IsBand ≈ ∙ → IsBand ≈ (flip ∙)
109
+ isBand : IsBand ∙ → IsBand (flip ∙)
90
110
isBand b = record
91
111
{ isSemigroup = isSemigroup b.isSemigroup
92
112
; idem = b.idem
93
113
}
94
114
where module b = IsBand b
95
115
96
- isCommutativeSemigroup : IsCommutativeSemigroup ≈ ∙ →
97
- IsCommutativeSemigroup ≈ (flip ∙)
116
+ isCommutativeSemigroup : IsCommutativeSemigroup ∙ →
117
+ IsCommutativeSemigroup (flip ∙)
98
118
isCommutativeSemigroup s = record
99
119
{ isSemigroup = isSemigroup s.isSemigroup
100
- ; comm = commutative ≈ ∙ s.comm
120
+ ; comm = commutative s.comm
101
121
}
102
122
where module s = IsCommutativeSemigroup s
103
123
104
- isUnitalMagma : IsUnitalMagma ≈ ∙ ε → IsUnitalMagma ≈ (flip ∙) ε
124
+ isUnitalMagma : IsUnitalMagma ∙ ε → IsUnitalMagma (flip ∙) ε
105
125
isUnitalMagma m = record
106
126
{ isMagma = isMagma m.isMagma
107
- ; identity = identity ≈ ∙ m.identity
127
+ ; identity = identity m.identity
108
128
}
109
129
where module m = IsUnitalMagma m
110
130
111
- isMonoid : IsMonoid ≈ ∙ ε → IsMonoid ≈ (flip ∙) ε
131
+ isMonoid : IsMonoid ∙ ε → IsMonoid (flip ∙) ε
112
132
isMonoid m = record
113
133
{ isSemigroup = isSemigroup m.isSemigroup
114
- ; identity = identity ≈ ∙ m.identity
134
+ ; identity = identity m.identity
115
135
}
116
136
where module m = IsMonoid m
117
137
118
- isCommutativeMonoid : IsCommutativeMonoid ≈ ∙ ε →
119
- IsCommutativeMonoid ≈ (flip ∙) ε
138
+ isCommutativeMonoid : IsCommutativeMonoid ∙ ε →
139
+ IsCommutativeMonoid (flip ∙) ε
120
140
isCommutativeMonoid m = record
121
141
{ isMonoid = isMonoid m.isMonoid
122
- ; comm = commutative ≈ ∙ m.comm
142
+ ; comm = commutative m.comm
123
143
}
124
144
where module m = IsCommutativeMonoid m
125
145
126
- isIdempotentCommutativeMonoid : IsIdempotentCommutativeMonoid ≈ ∙ ε →
127
- IsIdempotentCommutativeMonoid ≈ (flip ∙) ε
146
+ isIdempotentCommutativeMonoid : IsIdempotentCommutativeMonoid ∙ ε →
147
+ IsIdempotentCommutativeMonoid (flip ∙) ε
128
148
isIdempotentCommutativeMonoid m = record
129
149
{ isCommutativeMonoid = isCommutativeMonoid m.isCommutativeMonoid
130
- ; idem = idempotent ≈ ∙ m.idem
150
+ ; idem = idempotent m.idem
131
151
}
132
152
where module m = IsIdempotentCommutativeMonoid m
133
153
134
- isInvertibleMagma : IsInvertibleMagma ≈ ∙ ε ⁻¹ →
135
- IsInvertibleMagma ≈ (flip ∙) ε ⁻¹
154
+ isInvertibleMagma : IsInvertibleMagma ∙ ε ⁻¹ →
155
+ IsInvertibleMagma (flip ∙) ε ⁻¹
136
156
isInvertibleMagma m = record
137
157
{ isMagma = isMagma m.isMagma
138
- ; inverse = inverse ≈ ∙ m.inverse
158
+ ; inverse = inverse m.inverse
139
159
; ⁻¹-cong = m.⁻¹-cong
140
160
}
141
161
where module m = IsInvertibleMagma m
142
162
143
- isInvertibleUnitalMagma : IsInvertibleUnitalMagma ≈ ∙ ε ⁻¹ →
144
- IsInvertibleUnitalMagma ≈ (flip ∙) ε ⁻¹
163
+ isInvertibleUnitalMagma : IsInvertibleUnitalMagma ∙ ε ⁻¹ →
164
+ IsInvertibleUnitalMagma (flip ∙) ε ⁻¹
145
165
isInvertibleUnitalMagma m = record
146
166
{ isInvertibleMagma = isInvertibleMagma m.isInvertibleMagma
147
- ; identity = identity ≈ ∙ m.identity
167
+ ; identity = identity m.identity
148
168
}
149
169
where module m = IsInvertibleUnitalMagma m
150
170
151
- isGroup : IsGroup ≈ ∙ ε ⁻¹ → IsGroup ≈ (flip ∙) ε ⁻¹
171
+ isGroup : IsGroup ∙ ε ⁻¹ → IsGroup (flip ∙) ε ⁻¹
152
172
isGroup g = record
153
173
{ isMonoid = isMonoid g.isMonoid
154
- ; inverse = inverse ≈ ∙ g.inverse
174
+ ; inverse = inverse g.inverse
155
175
; ⁻¹-cong = g.⁻¹-cong
156
176
}
157
177
where module g = IsGroup g
158
178
159
- isAbelianGroup : IsAbelianGroup ≈ ∙ ε ⁻¹ → IsAbelianGroup ≈ (flip ∙) ε ⁻¹
179
+ isAbelianGroup : IsAbelianGroup ∙ ε ⁻¹ → IsAbelianGroup (flip ∙) ε ⁻¹
160
180
isAbelianGroup g = record
161
181
{ isGroup = isGroup g.isGroup
162
- ; comm = commutative ≈ ∙ g.comm
182
+ ; comm = commutative g.comm
163
183
}
164
184
where module g = IsAbelianGroup g
165
185
186
+ module _ {≈ : Rel A ℓ} {+ * : Op₂ A} {0# 1# : A} where
187
+
188
+ open Str ≈
189
+ open ∙-Properties ≈ *
190
+ open *-Properties ≈ * +
191
+
192
+ isSemiringWithoutAnnihilatingZero : IsSemiringWithoutAnnihilatingZero + * 0# 1# →
193
+ IsSemiringWithoutAnnihilatingZero + (flip *) 0# 1#
194
+ isSemiringWithoutAnnihilatingZero r = record
195
+ { +-isCommutativeMonoid = r.+-isCommutativeMonoid
196
+ ; *-cong = preserves₂ ≈ ≈ ≈ r.*-cong
197
+ ; *-assoc = associative r.sym r.*-assoc
198
+ ; *-identity = identity r.*-identity
199
+ ; distrib = distributes r.distrib
200
+ }
201
+ where module r = IsSemiringWithoutAnnihilatingZero r
202
+
203
+ isSemiring : IsSemiring + * 0# 1# → IsSemiring + (flip *) 0# 1#
204
+ isSemiring r = record
205
+ { isSemiringWithoutAnnihilatingZero = isSemiringWithoutAnnihilatingZero r.isSemiringWithoutAnnihilatingZero
206
+ ; zero = zero r.zero
207
+ }
208
+ where module r = IsSemiring r
209
+
210
+ isCommutativeSemiring : IsCommutativeSemiring + * 0# 1# →
211
+ IsCommutativeSemiring + (flip *) 0# 1#
212
+ isCommutativeSemiring r = record
213
+ { isSemiring = isSemiring r.isSemiring
214
+ ; *-comm = commutative r.*-comm
215
+ }
216
+ where module r = IsCommutativeSemiring r
217
+
218
+ isCancellativeCommutativeSemiring : IsCancellativeCommutativeSemiring + * 0# 1# →
219
+ IsCancellativeCommutativeSemiring + (flip *) 0# 1#
220
+ isCancellativeCommutativeSemiring r = record
221
+ { isCommutativeSemiring = isCommutativeSemiring r.isCommutativeSemiring
222
+ ; *-cancelˡ-nonZero = Consequences.comm∧almostCancelˡ⇒almostCancelʳ r.setoid r.*-comm r.*-cancelˡ-nonZero
223
+ }
224
+ where module r = IsCancellativeCommutativeSemiring r
225
+
226
+ isIdempotentSemiring : IsIdempotentSemiring + * 0# 1# →
227
+ IsIdempotentSemiring + (flip *) 0# 1#
228
+ isIdempotentSemiring r = record
229
+ { isSemiring = isSemiring r.isSemiring
230
+ ; +-idem = r.+-idem
231
+ }
232
+ where module r = IsIdempotentSemiring r
233
+
234
+ isQuasiring : IsQuasiring + * 0# 1# → IsQuasiring + (flip *) 0# 1#
235
+ isQuasiring r = record
236
+ { +-isMonoid = r.+-isMonoid
237
+ ; *-cong = preserves₂ ≈ ≈ ≈ r.*-cong
238
+ ; *-assoc = associative r.sym r.*-assoc
239
+ ; *-identity = identity r.*-identity
240
+ ; distrib = distributes r.distrib
241
+ ; zero = zero r.zero
242
+ }
243
+ where module r = IsQuasiring r
244
+
245
+ module _ {≈ : Rel A ℓ} {+ * : Op₂ A} { - : Op₁ A} {0# : A} where
246
+
247
+ open Str ≈
248
+ open ∙-Properties ≈ *
249
+ open *-Properties ≈ * +
250
+
251
+ isRingWithoutOne : IsRingWithoutOne + * - 0# → IsRingWithoutOne + (flip *) - 0#
252
+ isRingWithoutOne r = record
253
+ { +-isAbelianGroup = r.+-isAbelianGroup
254
+ ; *-cong = preserves₂ ≈ ≈ ≈ r.*-cong
255
+ ; *-assoc = associative r.sym r.*-assoc
256
+ ; distrib = distributes r.distrib
257
+ }
258
+ where module r = IsRingWithoutOne r
259
+
260
+ module _ {≈ : Rel A ℓ} {+ * : Op₂ A} { - : Op₁ A} {0# 1# : A} where
261
+
262
+ open Str ≈
263
+ open ∙-Properties ≈ *
264
+ open *-Properties ≈ * +
265
+
266
+ isNonAssociativeRing : IsNonAssociativeRing + * - 0# 1# →
267
+ IsNonAssociativeRing + (flip *) - 0# 1#
268
+ isNonAssociativeRing r = record
269
+ { +-isAbelianGroup = r.+-isAbelianGroup
270
+ ; *-cong = preserves₂ ≈ ≈ ≈ r.*-cong
271
+ ; *-identity = identity r.*-identity
272
+ ; distrib = distributes r.distrib
273
+ ; zero = zero r.zero
274
+ }
275
+ where module r = IsNonAssociativeRing r
276
+
277
+ isNearring : IsNearring + * 0# 1# - → IsNearring + (flip *) 0# 1# -
278
+ isNearring r = record
279
+ { isQuasiring = isQuasiring r.isQuasiring
280
+ ; +-inverse = r.+-inverse
281
+ ; ⁻¹-cong = r.⁻¹-cong
282
+ }
283
+ where module r = IsNearring r
284
+
285
+ isRing : IsRing + * - 0# 1# → IsRing + (flip *) - 0# 1#
286
+ isRing r = record
287
+ { +-isAbelianGroup = r.+-isAbelianGroup
288
+ ; *-cong = preserves₂ ≈ ≈ ≈ r.*-cong
289
+ ; *-assoc = associative r.sym r.*-assoc
290
+ ; *-identity = identity r.*-identity
291
+ ; distrib = distributes r.distrib
292
+ }
293
+ where module r = IsRing r
294
+
295
+ isCommutativeRing : IsCommutativeRing + * - 0# 1# →
296
+ IsCommutativeRing + (flip *) - 0# 1#
297
+ isCommutativeRing r = record
298
+ { isRing = isRing r.isRing
299
+ ; *-comm = commutative r.*-comm
300
+ }
301
+ where module r = IsCommutativeRing r
302
+
303
+
166
304
------------------------------------------------------------------------
167
305
-- Bundles
168
306
@@ -239,3 +377,54 @@ group g = record { isGroup = isGroup g.isGroup }
239
377
abelianGroup : AbelianGroup a ℓ → AbelianGroup a ℓ
240
378
abelianGroup g = record { isAbelianGroup = isAbelianGroup g.isAbelianGroup }
241
379
where module g = AbelianGroup g
380
+
381
+ semiringWithoutAnnihilatingZero : SemiringWithoutAnnihilatingZero a ℓ →
382
+ SemiringWithoutAnnihilatingZero a ℓ
383
+ semiringWithoutAnnihilatingZero r = record
384
+ { isSemiringWithoutAnnihilatingZero = isSemiringWithoutAnnihilatingZero r.isSemiringWithoutAnnihilatingZero }
385
+ where module r = SemiringWithoutAnnihilatingZero r
386
+
387
+ semiring : Semiring a ℓ → Semiring a ℓ
388
+ semiring r = record { isSemiring = isSemiring r.isSemiring }
389
+ where module r = Semiring r
390
+
391
+ commutativeSemiring : CommutativeSemiring a ℓ → CommutativeSemiring a ℓ
392
+ commutativeSemiring r = record
393
+ { isCommutativeSemiring = isCommutativeSemiring r.isCommutativeSemiring }
394
+ where module r = CommutativeSemiring r
395
+
396
+ cancellativeCommutativeSemiring : CancellativeCommutativeSemiring a ℓ →
397
+ CancellativeCommutativeSemiring a ℓ
398
+ cancellativeCommutativeSemiring r = record
399
+ { isCancellativeCommutativeSemiring = isCancellativeCommutativeSemiring r.isCancellativeCommutativeSemiring }
400
+ where module r = CancellativeCommutativeSemiring r
401
+
402
+ idempotentSemiring : IdempotentSemiring a ℓ → IdempotentSemiring a ℓ
403
+ idempotentSemiring r = record
404
+ { isIdempotentSemiring = isIdempotentSemiring r.isIdempotentSemiring }
405
+ where module r = IdempotentSemiring r
406
+
407
+ quasiring : Quasiring a ℓ → Quasiring a ℓ
408
+ quasiring r = record { isQuasiring = isQuasiring r.isQuasiring }
409
+ where module r = Quasiring r
410
+
411
+ ringWithoutOne : RingWithoutOne a ℓ → RingWithoutOne a ℓ
412
+ ringWithoutOne r = record { isRingWithoutOne = isRingWithoutOne r.isRingWithoutOne }
413
+ where module r = RingWithoutOne r
414
+
415
+ nonAssociativeRing : NonAssociativeRing a ℓ → NonAssociativeRing a ℓ
416
+ nonAssociativeRing r = record
417
+ { isNonAssociativeRing = isNonAssociativeRing r.isNonAssociativeRing }
418
+ where module r = NonAssociativeRing r
419
+
420
+ nearring : Nearring a ℓ → Nearring a ℓ
421
+ nearring r = record { isNearring = isNearring r.isNearring }
422
+ where module r = Nearring r
423
+
424
+ ring : Ring a ℓ → Ring a ℓ
425
+ ring r = record { isRing = isRing r.isRing }
426
+ where module r = Ring r
427
+
428
+ commutativeRing : CommutativeRing a ℓ → CommutativeRing a ℓ
429
+ commutativeRing r = record { isCommutativeRing = isCommutativeRing r.isCommutativeRing }
430
+ where module r = CommutativeRing r
0 commit comments