99
1010module Algebra.Construct.Flip.Op where
1111
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
1519open import Function.Base using (flip)
1620open import Level using (Level)
1721open import Relation.Binary.Core using (Rel; _Preserves₂_⟶_⟶_)
@@ -33,136 +37,270 @@ preserves₂ : (∼ ≈ ≋ : Rel A ℓ) →
3337 ∙ Preserves₂ ∼ ⟶ ≈ ⟶ ≋ → (flip ∙) Preserves₂ ≈ ⟶ ∼ ⟶ ≋
3438preserves₂ _ _ _ pres = flip pres
3539
36- module _ (≈ : Rel A ℓ) (∙ : Op₂ A) where
40+ module ∙-Properties (≈ : Rel A ℓ) (∙ : Op₂ A) where
3741
38- associative : Symmetric ≈ → Associative ≈ ∙ → Associative ≈ (flip ∙)
42+ open Def ≈
43+
44+ associative : Symmetric ≈ → Associative ∙ → Associative (flip ∙)
3945 associative sym assoc x y z = sym (assoc z y x)
4046
41- identity : Identity ≈ ε ∙ → Identity ≈ ε (flip ∙)
42- identity id = Product .swap id
47+ identity : Identity ε ∙ → Identity ε (flip ∙)
48+ identity id = Prod .swap id
4349
44- commutative : Commutative ≈ ∙ → Commutative ≈ (flip ∙)
50+ commutative : Commutative ∙ → Commutative (flip ∙)
4551 commutative comm = flip comm
4652
47- selective : Selective ≈ ∙ → Selective ≈ (flip ∙)
53+ selective : Selective ∙ → Selective (flip ∙)
4854 selective sel x y = Sum.swap (sel y x)
4955
50- idempotent : Idempotent ≈ ∙ → Idempotent ≈ (flip ∙)
56+ idempotent : Idempotent ∙ → Idempotent (flip ∙)
5157 idempotent idem = idem
5258
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
5571
5672------------------------------------------------------------------------
5773-- Structures
5874
5975module _ {≈ : Rel A ℓ} {∙ : Op₂ A} where
6076
61- isMagma : IsMagma ≈ ∙ → IsMagma ≈ (flip ∙)
77+ open Def ≈
78+ open Str ≈
79+ open ∙-Properties ≈ ∙
80+
81+ isMagma : IsMagma ∙ → IsMagma (flip ∙)
6282 isMagma m = record
6383 { isEquivalence = isEquivalence
6484 ; ∙-cong = preserves₂ ≈ ≈ ≈ ∙-cong
6585 }
6686 where open IsMagma m
6787
68- isSelectiveMagma : IsSelectiveMagma ≈ ∙ → IsSelectiveMagma ≈ (flip ∙)
88+ isSelectiveMagma : IsSelectiveMagma ∙ → IsSelectiveMagma (flip ∙)
6989 isSelectiveMagma m = record
7090 { isMagma = isMagma m.isMagma
71- ; sel = selective ≈ ∙ m.sel
91+ ; sel = selective m.sel
7292 }
7393 where module m = IsSelectiveMagma m
7494
75- isCommutativeMagma : IsCommutativeMagma ≈ ∙ → IsCommutativeMagma ≈ (flip ∙)
95+ isCommutativeMagma : IsCommutativeMagma ∙ → IsCommutativeMagma (flip ∙)
7696 isCommutativeMagma m = record
7797 { isMagma = isMagma m.isMagma
78- ; comm = commutative ≈ ∙ m.comm
98+ ; comm = commutative m.comm
7999 }
80100 where module m = IsCommutativeMagma m
81101
82- isSemigroup : IsSemigroup ≈ ∙ → IsSemigroup ≈ (flip ∙)
102+ isSemigroup : IsSemigroup ∙ → IsSemigroup (flip ∙)
83103 isSemigroup s = record
84104 { isMagma = isMagma s.isMagma
85- ; assoc = associative ≈ ∙ s.sym s.assoc
105+ ; assoc = associative s.sym s.assoc
86106 }
87107 where module s = IsSemigroup s
88108
89- isBand : IsBand ≈ ∙ → IsBand ≈ (flip ∙)
109+ isBand : IsBand ∙ → IsBand (flip ∙)
90110 isBand b = record
91111 { isSemigroup = isSemigroup b.isSemigroup
92112 ; idem = b.idem
93113 }
94114 where module b = IsBand b
95115
96- isCommutativeSemigroup : IsCommutativeSemigroup ≈ ∙ →
97- IsCommutativeSemigroup ≈ (flip ∙)
116+ isCommutativeSemigroup : IsCommutativeSemigroup ∙ →
117+ IsCommutativeSemigroup (flip ∙)
98118 isCommutativeSemigroup s = record
99119 { isSemigroup = isSemigroup s.isSemigroup
100- ; comm = commutative ≈ ∙ s.comm
120+ ; comm = commutative s.comm
101121 }
102122 where module s = IsCommutativeSemigroup s
103123
104- isUnitalMagma : IsUnitalMagma ≈ ∙ ε → IsUnitalMagma ≈ (flip ∙) ε
124+ isUnitalMagma : IsUnitalMagma ∙ ε → IsUnitalMagma (flip ∙) ε
105125 isUnitalMagma m = record
106126 { isMagma = isMagma m.isMagma
107- ; identity = identity ≈ ∙ m.identity
127+ ; identity = identity m.identity
108128 }
109129 where module m = IsUnitalMagma m
110130
111- isMonoid : IsMonoid ≈ ∙ ε → IsMonoid ≈ (flip ∙) ε
131+ isMonoid : IsMonoid ∙ ε → IsMonoid (flip ∙) ε
112132 isMonoid m = record
113133 { isSemigroup = isSemigroup m.isSemigroup
114- ; identity = identity ≈ ∙ m.identity
134+ ; identity = identity m.identity
115135 }
116136 where module m = IsMonoid m
117137
118- isCommutativeMonoid : IsCommutativeMonoid ≈ ∙ ε →
119- IsCommutativeMonoid ≈ (flip ∙) ε
138+ isCommutativeMonoid : IsCommutativeMonoid ∙ ε →
139+ IsCommutativeMonoid (flip ∙) ε
120140 isCommutativeMonoid m = record
121141 { isMonoid = isMonoid m.isMonoid
122- ; comm = commutative ≈ ∙ m.comm
142+ ; comm = commutative m.comm
123143 }
124144 where module m = IsCommutativeMonoid m
125145
126- isIdempotentCommutativeMonoid : IsIdempotentCommutativeMonoid ≈ ∙ ε →
127- IsIdempotentCommutativeMonoid ≈ (flip ∙) ε
146+ isIdempotentCommutativeMonoid : IsIdempotentCommutativeMonoid ∙ ε →
147+ IsIdempotentCommutativeMonoid (flip ∙) ε
128148 isIdempotentCommutativeMonoid m = record
129149 { isCommutativeMonoid = isCommutativeMonoid m.isCommutativeMonoid
130- ; idem = idempotent ≈ ∙ m.idem
150+ ; idem = idempotent m.idem
131151 }
132152 where module m = IsIdempotentCommutativeMonoid m
133153
134- isInvertibleMagma : IsInvertibleMagma ≈ ∙ ε ⁻¹ →
135- IsInvertibleMagma ≈ (flip ∙) ε ⁻¹
154+ isInvertibleMagma : IsInvertibleMagma ∙ ε ⁻¹ →
155+ IsInvertibleMagma (flip ∙) ε ⁻¹
136156 isInvertibleMagma m = record
137157 { isMagma = isMagma m.isMagma
138- ; inverse = inverse ≈ ∙ m.inverse
158+ ; inverse = inverse m.inverse
139159 ; ⁻¹-cong = m.⁻¹-cong
140160 }
141161 where module m = IsInvertibleMagma m
142162
143- isInvertibleUnitalMagma : IsInvertibleUnitalMagma ≈ ∙ ε ⁻¹ →
144- IsInvertibleUnitalMagma ≈ (flip ∙) ε ⁻¹
163+ isInvertibleUnitalMagma : IsInvertibleUnitalMagma ∙ ε ⁻¹ →
164+ IsInvertibleUnitalMagma (flip ∙) ε ⁻¹
145165 isInvertibleUnitalMagma m = record
146166 { isInvertibleMagma = isInvertibleMagma m.isInvertibleMagma
147- ; identity = identity ≈ ∙ m.identity
167+ ; identity = identity m.identity
148168 }
149169 where module m = IsInvertibleUnitalMagma m
150170
151- isGroup : IsGroup ≈ ∙ ε ⁻¹ → IsGroup ≈ (flip ∙) ε ⁻¹
171+ isGroup : IsGroup ∙ ε ⁻¹ → IsGroup (flip ∙) ε ⁻¹
152172 isGroup g = record
153173 { isMonoid = isMonoid g.isMonoid
154- ; inverse = inverse ≈ ∙ g.inverse
174+ ; inverse = inverse g.inverse
155175 ; ⁻¹-cong = g.⁻¹-cong
156176 }
157177 where module g = IsGroup g
158178
159- isAbelianGroup : IsAbelianGroup ≈ ∙ ε ⁻¹ → IsAbelianGroup ≈ (flip ∙) ε ⁻¹
179+ isAbelianGroup : IsAbelianGroup ∙ ε ⁻¹ → IsAbelianGroup (flip ∙) ε ⁻¹
160180 isAbelianGroup g = record
161181 { isGroup = isGroup g.isGroup
162- ; comm = commutative ≈ ∙ g.comm
182+ ; comm = commutative g.comm
163183 }
164184 where module g = IsAbelianGroup g
165185
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+
166304------------------------------------------------------------------------
167305-- Bundles
168306
@@ -239,3 +377,54 @@ group g = record { isGroup = isGroup g.isGroup }
239377abelianGroup : AbelianGroup a ℓ → AbelianGroup a ℓ
240378abelianGroup g = record { isAbelianGroup = isAbelianGroup g.isAbelianGroup }
241379 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