Skip to content

Commit 12d99db

Browse files
JacquesCarettejamesmckinnaTanebSeiryn21MatthewDaggitt
committed
Add back accidentally removed lemmas (Issue2788 #2794))
* opposite of a `Ring` [clean version of pr #1900] (#1910) * punchOut preserves ordering (#1913) * Wellfounded proof for sum relations (#1920) * last revert undone by hand * Remove extra line in CHANGELOG * Update CHANGELOG.md Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * Update CHANGELOG.md Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * Update CHANGELOG.md Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * Update CHANGELOG.md This was indeed anachronistic from 2.0 Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * Update CHANGELOG.md Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * resolve issues pointed out by James. * Update CHANGELOG.md Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> * remove now obsolete comment * last mistake in CHANGELOG, hopefully fixed now. --------- Co-authored-by: jamesmckinna <31931406+jamesmckinna@users.noreply.github.com> Co-authored-by: Nathan van Doorn <nvd1234@gmail.com> Co-authored-by: Alice Laroche <60161310+Seiryn21@users.noreply.github.com> Co-authored-by: matthewdaggitt <matthewdaggitt@gmail.com>
1 parent d4c0a97 commit 12d99db

File tree

5 files changed

+288
-43
lines changed

5 files changed

+288
-43
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ Additions to existing modules
6565
```
6666

6767
* In `Data.Fin.Properties`:
68+
6869
```agda
6970
≡-irrelevant : Irrelevant {A = Fin n} _≡_
7071
≟-≡ : (eq : i ≡ j) → (i ≟ j) ≡ yes eq

src/Algebra/Construct/Flip/Op.agda

Lines changed: 232 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99

1010
module 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
1519
open import Function.Base using (flip)
1620
open import Level using (Level)
1721
open import Relation.Binary.Core using (Rel; _Preserves₂_⟶_⟶_)
@@ -33,136 +37,270 @@ preserves₂ : (∼ ≈ ≋ : Rel A ℓ) →
3337
∙ Preserves₂ ∼ ⟶ ≈ ⟶ ≋ (flip ∙) Preserves₂ ≈ ⟶ ∼ ⟶ ≋
3438
preserves₂ _ _ _ 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

5975
module _ {≈ : 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 }
239377
abelianGroup : AbelianGroup a ℓ AbelianGroup a ℓ
240378
abelianGroup 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

Comments
 (0)