Skip to content

Commit 49fa098

Browse files
authored
[ new ] add definitions of module-like structures (#897)
1 parent c942aaa commit 49fa098

File tree

12 files changed

+1222
-0
lines changed

12 files changed

+1222
-0
lines changed

CHANGELOG.md

+17
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,23 @@ Other major additions
386386
- `DecTotalOrder.Eq` and `StrictTotalOrder.Eq` now export `decSetoid`.
387387
- `DecTotalOrder.decSetoid` is now deprecated in favour of the above `DecTotalOrder.Eq.decSetoid`.
388388

389+
* Added a hierarchy for algebraic modules:
390+
```
391+
Algebra.Module
392+
Algebra.Module.Bundles
393+
Algebra.Module.Consequences
394+
Algebra.Module.Construct.Biproduct
395+
Algebra.Module.Construct.TensorUnit
396+
Algebra.Module.Construct.Zero
397+
Algebra.Module.Definitions
398+
Algebra.Module.Definitions.Bi
399+
Algebra.Module.Definitions.Left
400+
Algebra.Module.Definitions.Right
401+
Algebra.Module.Structures
402+
Algebra.Module.Structures.Biased
403+
```
404+
Supported are all of {left ,right , bi,}{semi,}modules.
405+
389406
Other minor additions
390407
---------------------
391408

src/Algebra/Core.agda

+11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
module Algebra.Core where
1212

13+
open import Level using (_⊔_)
14+
1315
------------------------------------------------------------------------
1416
-- Unary and binary operations
1517

@@ -18,3 +20,12 @@ Op₁ A = A → A
1820

1921
Op₂ : {ℓ} Set Set
2022
Op₂ A = A A A
23+
24+
------------------------------------------------------------------------
25+
-- Left and right actions
26+
27+
Opₗ : {a b} Set a Set b Set (a ⊔ b)
28+
Opₗ A B = A B B
29+
30+
Opᵣ : {a b} Set a Set b Set (a ⊔ b)
31+
Opᵣ A B = B A B

src/Algebra/Module/Bundles.agda

+334
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,334 @@
1+
------------------------------------------------------------------------
2+
-- The Agda standard library
3+
--
4+
-- Definitions of algebraic structures defined over some other
5+
-- structure, like modules and vector spaces
6+
--
7+
-- Terminology of bundles:
8+
-- * There are both *semimodules* and *modules*.
9+
-- - For M an R-semimodule, R is a semiring, and M forms a commutative
10+
-- monoid.
11+
-- - For M an R-module, R is a ring, and M forms an Abelian group.
12+
-- * There are all four of *left modules*, *right modules*, *bimodules*,
13+
-- and *modules*.
14+
-- - Left modules have a left-scaling operation.
15+
-- - Right modules have a right-scaling operation.
16+
-- - Bimodules have two sorts of scalars. Left-scaling handles one and
17+
-- right-scaling handles the other. Left-scaling and right-scaling
18+
-- are furthermore compatible.
19+
-- - Modules are bimodules with a single sort of scalars and scalar
20+
-- multiplication must also be commutative. Left-scaling and
21+
-- right-scaling coincide.
22+
------------------------------------------------------------------------
23+
24+
{-# OPTIONS --without-K --safe #-}
25+
26+
module Algebra.Module.Bundles where
27+
28+
open import Algebra.Bundles
29+
open import Algebra.Core
30+
open import Algebra.Module.Structures
31+
open import Algebra.Module.Definitions
32+
open import Function.Base
33+
open import Level
34+
open import Relation.Binary
35+
import Relation.Binary.Reasoning.Setoid as SetR
36+
37+
private
38+
variable
39+
r ℓr s ℓs : Level
40+
41+
------------------------------------------------------------------------
42+
-- Left modules
43+
------------------------------------------------------------------------
44+
45+
record LeftSemimodule (semiring : Semiring r ℓr) m ℓm
46+
: Set (r ⊔ ℓr ⊔ suc (m ⊔ ℓm)) where
47+
open Semiring semiring
48+
49+
infixr 7 _*ₗ_
50+
infixl 6 _+ᴹ_
51+
infix 4 _≈ᴹ_
52+
53+
field
54+
Carrierᴹ : Set m
55+
_≈ᴹ_ : Rel Carrierᴹ ℓm
56+
_+ᴹ_ : Op₂ Carrierᴹ
57+
_*ₗ_ : Opₗ Carrier Carrierᴹ
58+
0ᴹ : Carrierᴹ
59+
isLeftSemimodule : IsLeftSemimodule semiring _≈ᴹ_ _+ᴹ_ 0ᴹ _*ₗ_
60+
61+
open IsLeftSemimodule isLeftSemimodule public
62+
63+
+ᴹ-commutativeMonoid : CommutativeMonoid m ℓm
64+
+ᴹ-commutativeMonoid = record
65+
{ isCommutativeMonoid = +ᴹ-isCommutativeMonoid
66+
}
67+
68+
open CommutativeMonoid +ᴹ-commutativeMonoid public
69+
using () renaming
70+
( monoid to +ᴹ-monoid
71+
; semigroup to +ᴹ-semigroup
72+
; magma to +ᴹ-magma
73+
; rawMagma to +ᴹ-rawMagma
74+
; rawMonoid to +ᴹ-rawMonoid
75+
)
76+
77+
record LeftModule (ring : Ring r ℓr) m ℓm : Set (r ⊔ ℓr ⊔ suc (m ⊔ ℓm)) where
78+
open Ring ring
79+
80+
infixr 8 -ᴹ_
81+
infixr 7 _*ₗ_
82+
infixl 6 _+ᴹ_
83+
infix 4 _≈ᴹ_
84+
85+
field
86+
Carrierᴹ : Set m
87+
_≈ᴹ_ : Rel Carrierᴹ ℓm
88+
_+ᴹ_ : Op₂ Carrierᴹ
89+
_*ₗ_ : Opₗ Carrier Carrierᴹ
90+
0ᴹ : Carrierᴹ
91+
-ᴹ_ : Op₁ Carrierᴹ
92+
isLeftModule : IsLeftModule ring _≈ᴹ_ _+ᴹ_ 0ᴹ -ᴹ_ _*ₗ_
93+
94+
open IsLeftModule isLeftModule public
95+
96+
leftSemimodule : LeftSemimodule semiring m ℓm
97+
leftSemimodule = record { isLeftSemimodule = isLeftSemimodule }
98+
99+
open LeftSemimodule leftSemimodule public
100+
using ( +ᴹ-commutativeMonoid; +ᴹ-monoid; +ᴹ-semigroup; +ᴹ-magma
101+
; +ᴹ-rawMagma; +ᴹ-rawMonoid)
102+
103+
+ᴹ-abelianGroup : AbelianGroup m ℓm
104+
+ᴹ-abelianGroup = record { isAbelianGroup = +ᴹ-isAbelianGroup }
105+
106+
open AbelianGroup +ᴹ-abelianGroup public
107+
using () renaming (group to +ᴹ-group)
108+
109+
------------------------------------------------------------------------
110+
-- Right modules
111+
------------------------------------------------------------------------
112+
113+
record RightSemimodule (semiring : Semiring r ℓr) m ℓm
114+
: Set (r ⊔ ℓr ⊔ suc (m ⊔ ℓm)) where
115+
open Semiring semiring
116+
117+
infixl 7 _*ᵣ_
118+
infixl 6 _+ᴹ_
119+
infix 4 _≈ᴹ_
120+
121+
field
122+
Carrierᴹ : Set m
123+
_≈ᴹ_ : Rel Carrierᴹ ℓm
124+
_+ᴹ_ : Op₂ Carrierᴹ
125+
_*ᵣ_ : Opᵣ Carrier Carrierᴹ
126+
0ᴹ : Carrierᴹ
127+
isRightSemimodule : IsRightSemimodule semiring _≈ᴹ_ _+ᴹ_ 0ᴹ _*ᵣ_
128+
129+
open IsRightSemimodule isRightSemimodule public
130+
131+
+ᴹ-commutativeMonoid : CommutativeMonoid m ℓm
132+
+ᴹ-commutativeMonoid = record
133+
{ isCommutativeMonoid = +ᴹ-isCommutativeMonoid
134+
}
135+
136+
open CommutativeMonoid +ᴹ-commutativeMonoid public
137+
using () renaming
138+
( monoid to +ᴹ-monoid
139+
; semigroup to +ᴹ-semigroup
140+
; magma to +ᴹ-magma
141+
; rawMagma to +ᴹ-rawMagma
142+
; rawMonoid to +ᴹ-rawMonoid
143+
)
144+
145+
record RightModule (ring : Ring r ℓr) m ℓm : Set (r ⊔ ℓr ⊔ suc (m ⊔ ℓm)) where
146+
open Ring ring
147+
148+
infixr 8 -ᴹ_
149+
infixl 7 _*ᵣ_
150+
infixl 6 _+ᴹ_
151+
infix 4 _≈ᴹ_
152+
153+
field
154+
Carrierᴹ : Set m
155+
_≈ᴹ_ : Rel Carrierᴹ ℓm
156+
_+ᴹ_ : Op₂ Carrierᴹ
157+
_*ᵣ_ : Opᵣ Carrier Carrierᴹ
158+
0ᴹ : Carrierᴹ
159+
-ᴹ_ : Op₁ Carrierᴹ
160+
isRightModule : IsRightModule ring _≈ᴹ_ _+ᴹ_ 0ᴹ -ᴹ_ _*ᵣ_
161+
162+
open IsRightModule isRightModule public
163+
164+
rightSemimodule : RightSemimodule semiring m ℓm
165+
rightSemimodule = record { isRightSemimodule = isRightSemimodule }
166+
167+
open RightSemimodule rightSemimodule public
168+
using ( +ᴹ-commutativeMonoid; +ᴹ-monoid; +ᴹ-semigroup; +ᴹ-magma
169+
; +ᴹ-rawMagma; +ᴹ-rawMonoid)
170+
171+
+ᴹ-abelianGroup : AbelianGroup m ℓm
172+
+ᴹ-abelianGroup = record { isAbelianGroup = +ᴹ-isAbelianGroup }
173+
174+
open AbelianGroup +ᴹ-abelianGroup public
175+
using () renaming (group to +ᴹ-group)
176+
177+
------------------------------------------------------------------------
178+
-- Bimodules
179+
------------------------------------------------------------------------
180+
181+
record Bisemimodule (R-semiring : Semiring r ℓr) (S-semiring : Semiring s ℓs)
182+
m ℓm : Set (r ⊔ s ⊔ ℓr ⊔ ℓs ⊔ suc (m ⊔ ℓm)) where
183+
private
184+
module R = Semiring R-semiring
185+
module S = Semiring S-semiring
186+
187+
infixr 7 _*ₗ_
188+
infixl 6 _+ᴹ_
189+
infix 4 _≈ᴹ_
190+
191+
field
192+
Carrierᴹ : Set m
193+
_≈ᴹ_ : Rel Carrierᴹ ℓm
194+
_+ᴹ_ : Op₂ Carrierᴹ
195+
_*ₗ_ : Opₗ R.Carrier Carrierᴹ
196+
_*ᵣ_ : Opᵣ S.Carrier Carrierᴹ
197+
0ᴹ : Carrierᴹ
198+
isBisemimodule : IsBisemimodule R-semiring S-semiring _≈ᴹ_ _+ᴹ_ 0ᴹ _*ₗ_ _*ᵣ_
199+
200+
open IsBisemimodule isBisemimodule public
201+
202+
leftSemimodule : LeftSemimodule R-semiring m ℓm
203+
leftSemimodule = record { isLeftSemimodule = isLeftSemimodule }
204+
205+
rightSemimodule : RightSemimodule S-semiring m ℓm
206+
rightSemimodule = record { isRightSemimodule = isRightSemimodule }
207+
208+
open LeftSemimodule leftSemimodule public
209+
using ( +ᴹ-commutativeMonoid; +ᴹ-monoid; +ᴹ-semigroup; +ᴹ-magma; +ᴹ-rawMagma
210+
; +ᴹ-rawMonoid)
211+
212+
record Bimodule (R-ring : Ring r ℓr) (S-ring : Ring s ℓs) m ℓm
213+
: Set (r ⊔ s ⊔ ℓr ⊔ ℓs ⊔ suc (m ⊔ ℓm)) where
214+
private
215+
module R = Ring R-ring
216+
module S = Ring S-ring
217+
218+
infixr 7 _*ₗ_
219+
infixl 6 _+ᴹ_
220+
infix 4 _≈ᴹ_
221+
222+
field
223+
Carrierᴹ : Set m
224+
_≈ᴹ_ : Rel Carrierᴹ ℓm
225+
_+ᴹ_ : Op₂ Carrierᴹ
226+
_*ₗ_ : Opₗ R.Carrier Carrierᴹ
227+
_*ᵣ_ : Opᵣ S.Carrier Carrierᴹ
228+
0ᴹ : Carrierᴹ
229+
-ᴹ_ : Op₁ Carrierᴹ
230+
isBimodule : IsBimodule R-ring S-ring _≈ᴹ_ _+ᴹ_ 0ᴹ -ᴹ_ _*ₗ_ _*ᵣ_
231+
232+
open IsBimodule isBimodule public
233+
234+
leftModule : LeftModule R-ring m ℓm
235+
leftModule = record { isLeftModule = isLeftModule }
236+
237+
rightModule : RightModule S-ring m ℓm
238+
rightModule = record { isRightModule = isRightModule }
239+
240+
open LeftModule leftModule public
241+
using ( +ᴹ-abelianGroup; +ᴹ-commutativeMonoid; +ᴹ-group; +ᴹ-monoid
242+
; +ᴹ-semigroup; +ᴹ-magma; +ᴹ-rawMagma; +ᴹ-rawMonoid)
243+
244+
bisemimodule : Bisemimodule R.semiring S.semiring m ℓm
245+
bisemimodule = record { isBisemimodule = isBisemimodule }
246+
247+
open Bisemimodule bisemimodule public
248+
using (leftSemimodule; rightSemimodule)
249+
250+
------------------------------------------------------------------------
251+
-- Modules over commutative structures
252+
------------------------------------------------------------------------
253+
254+
record Semimodule (commutativeSemiring : CommutativeSemiring r ℓr) m ℓm
255+
: Set (r ⊔ ℓr ⊔ suc (m ⊔ ℓm)) where
256+
open CommutativeSemiring commutativeSemiring
257+
258+
infixr 7 _*ₗ_
259+
infixl 7 _*ᵣ_
260+
infixl 6 _+ᴹ_
261+
infix 4 _≈ᴹ_
262+
263+
field
264+
Carrierᴹ : Set m
265+
_≈ᴹ_ : Rel Carrierᴹ ℓm
266+
_+ᴹ_ : Op₂ Carrierᴹ
267+
_*ₗ_ : Opₗ Carrier Carrierᴹ
268+
_*ᵣ_ : Opᵣ Carrier Carrierᴹ
269+
0ᴹ : Carrierᴹ
270+
isSemimodule : IsSemimodule commutativeSemiring _≈ᴹ_ _+ᴹ_ 0ᴹ _*ₗ_ _*ᵣ_
271+
272+
open IsSemimodule isSemimodule public
273+
274+
private
275+
module L = LeftDefs Carrier _≈ᴹ_
276+
module R = RightDefs Carrier _≈ᴹ_
277+
278+
bisemimodule : Bisemimodule semiring semiring m ℓm
279+
bisemimodule = record { isBisemimodule = isBisemimodule }
280+
281+
open Bisemimodule bisemimodule public
282+
using ( leftSemimodule; rightSemimodule
283+
; +ᴹ-commutativeMonoid; +ᴹ-monoid; +ᴹ-semigroup; +ᴹ-magma
284+
; +ᴹ-rawMagma; +ᴹ-rawMonoid)
285+
286+
open SetR ≈ᴹ-setoid
287+
288+
*ₗ-comm : L.Commutative _*ₗ_
289+
*ₗ-comm x y m = begin
290+
x *ₗ y *ₗ m ≈⟨ ≈ᴹ-sym (*ₗ-assoc x y m) ⟩
291+
(x * y) *ₗ m ≈⟨ *ₗ-cong (*-comm _ _) ≈ᴹ-refl ⟩
292+
(y * x) *ₗ m ≈⟨ *ₗ-assoc y x m ⟩
293+
y *ₗ x *ₗ m ∎
294+
295+
*ᵣ-comm : R.Commutative _*ᵣ_
296+
*ᵣ-comm m x y = begin
297+
m *ᵣ x *ᵣ y ≈⟨ *ᵣ-assoc m x y ⟩
298+
m *ᵣ (x * y) ≈⟨ *ᵣ-cong ≈ᴹ-refl (*-comm _ _) ⟩
299+
m *ᵣ (y * x) ≈⟨ ≈ᴹ-sym (*ᵣ-assoc m y x) ⟩
300+
m *ᵣ y *ᵣ x ∎
301+
302+
record Module (commutativeRing : CommutativeRing r ℓr) m ℓm
303+
: Set (r ⊔ ℓr ⊔ suc (m ⊔ ℓm)) where
304+
open CommutativeRing commutativeRing
305+
306+
infixr 8 -ᴹ_
307+
infixr 7 _*ₗ_
308+
infixl 6 _+ᴹ_
309+
infix 4 _≈ᴹ_
310+
311+
field
312+
Carrierᴹ : Set m
313+
_≈ᴹ_ : Rel Carrierᴹ ℓm
314+
_+ᴹ_ : Op₂ Carrierᴹ
315+
_*ₗ_ : Opₗ Carrier Carrierᴹ
316+
_*ᵣ_ : Opᵣ Carrier Carrierᴹ
317+
0ᴹ : Carrierᴹ
318+
-ᴹ_ : Op₁ Carrierᴹ
319+
isModule : IsModule commutativeRing _≈ᴹ_ _+ᴹ_ 0ᴹ -ᴹ_ _*ₗ_ _*ᵣ_
320+
321+
open IsModule isModule public
322+
323+
bimodule : Bimodule ring ring m ℓm
324+
bimodule = record { isBimodule = isBimodule }
325+
326+
open Bimodule bimodule public
327+
using ( leftModule; rightModule; leftSemimodule; rightSemimodule
328+
; +ᴹ-abelianGroup; +ᴹ-group; +ᴹ-commutativeMonoid; +ᴹ-monoid
329+
; +ᴹ-semigroup; +ᴹ-magma ; +ᴹ-rawMonoid; +ᴹ-rawMagma)
330+
331+
semimodule : Semimodule commutativeSemiring m ℓm
332+
semimodule = record { isSemimodule = isSemimodule }
333+
334+
open Semimodule semimodule public using (*ₗ-comm; *ᵣ-comm)

0 commit comments

Comments
 (0)