|
| 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