summaryrefslogtreecommitdiff
path: root/src/Helium/Algebra/Structures.agda
diff options
context:
space:
mode:
Diffstat (limited to 'src/Helium/Algebra/Structures.agda')
-rw-r--r--src/Helium/Algebra/Structures.agda162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/Helium/Algebra/Structures.agda b/src/Helium/Algebra/Structures.agda
new file mode 100644
index 0000000..b64b4c7
--- /dev/null
+++ b/src/Helium/Algebra/Structures.agda
@@ -0,0 +1,162 @@
+------------------------------------------------------------------------
+-- Agda Helium
+--
+-- Some more algebraic structures
+-- (not packed up with sets, operations, etc.)
+------------------------------------------------------------------------
+
+{-# OPTIONS --safe --without-K #-}
+
+open import Relation.Binary.Core using (Rel)
+module Helium.Algebra.Structures
+ {a ℓ} {A : Set a} -- The underlying set
+ (_≈_ : Rel A ℓ) -- The underlying equality relation
+ where
+
+open import Algebra.Core
+open import Algebra.Definitions _≈_
+open import Algebra.Structures _≈_
+open import Data.Product using (proj₁; proj₂)
+open import Helium.Algebra.Core
+open import Helium.Algebra.Definitions _≈_
+import Helium.Algebra.Consequences.Setoid as Consequences
+open import Level using (_⊔_)
+open import Relation.Nullary using (¬_)
+
+record IsAlmostGroup
+ (_∙_ : Op₂ A) (0# 1# : A) (_⁻¹ : AlmostOp₁ _≈_ 0#) : Set (a ⊔ ℓ) where
+ field
+ isMonoid : IsMonoid _∙_ 1#
+ inverse : AlmostInverse 1# _⁻¹ _∙_
+ ⁻¹-cong : AlmostCongruent₁ _⁻¹
+
+ open IsMonoid isMonoid public
+
+ infixl 6 _-_
+ _-_ : AlmostOp₂ _≈_ 0#
+ x - y≉0 = x ∙ (y≉0 ⁻¹)
+
+ inverseˡ : AlmostLeftInverse 1# _⁻¹ _∙_
+ inverseˡ = proj₁ inverse
+
+ inverseʳ : AlmostRightInverse 1# _⁻¹ _∙_
+ inverseʳ = proj₂ inverse
+
+ uniqueˡ-⁻¹ : ∀ x {y} (y≉0 : ¬ y ≈ 0#) → (x ∙ y) ≈ 1# → x ≈ (y≉0 ⁻¹)
+ uniqueˡ-⁻¹ = Consequences.assoc+id+invʳ⇒invˡ-unique
+ setoid ∙-cong assoc identity inverseʳ
+
+ uniqueʳ-⁻¹ : ∀ {x} (x≉0 : ¬ x ≈ 0#) y → (x ∙ y) ≈ 1# → y ≈ (x≉0 ⁻¹)
+ uniqueʳ-⁻¹ = Consequences.assoc+id+invˡ⇒invʳ-unique
+ setoid ∙-cong assoc identity inverseˡ
+
+record IsAlmostAbelianGroup
+ (∙ : Op₂ A) (0# 1# : A) (⁻¹ : AlmostOp₁ _≈_ 0#) : Set (a ⊔ ℓ) where
+ field
+ isAlmostGroup : IsAlmostGroup ∙ 0# 1# ⁻¹
+ comm : Commutative ∙
+
+ open IsAlmostGroup isAlmostGroup
+
+ isCommutativeMonoid : IsCommutativeMonoid ∙ 1#
+ isCommutativeMonoid = record
+ { isMonoid = isMonoid
+ ; comm = comm
+ }
+
+ open IsCommutativeMonoid isCommutativeMonoid public
+ using (isCommutativeMagma; isCommutativeSemigroup)
+
+record IsDivisionRing
+ (+ _*_ : Op₂ A) (-_ : Op₁ A) (0# 1# : A)
+ (_⁻¹ : AlmostOp₁ _≈_ 0#) : Set (a ⊔ ℓ) where
+ field
+ +-isAbelianGroup : IsAbelianGroup + 0# -_
+ *-isAlmostGroup : IsAlmostGroup _*_ 0# 1# _⁻¹
+ distrib : _*_ DistributesOver +
+ zero : Zero 0# _*_
+
+ infixl 7 _/_
+ _/_ : AlmostOp₂ _≈_ 0#
+ x / y≉0 = x * (y≉0 ⁻¹)
+
+ open IsAbelianGroup +-isAbelianGroup public
+ renaming
+ ( assoc to +-assoc
+ ; ∙-cong to +-cong
+ ; ∙-congˡ to +-congˡ
+ ; ∙-congʳ to +-congʳ
+ ; identity to +-identity
+ ; identityˡ to +-identityˡ
+ ; identityʳ to +-identityʳ
+ ; inverse to -‿inverse
+ ; inverseˡ to -‿inverseˡ
+ ; inverseʳ to -‿inverseʳ
+ ; ⁻¹-cong to -‿cong
+ ; uniqueˡ-⁻¹ to uniqueˡ‿-
+ ; uniqueʳ-⁻¹ to uniqueʳ‿-
+ ; comm to +-comm
+ ; isMagma to +-isMagma
+ ; isSemigroup to +-isSemigroup
+ ; isMonoid to +-isMonoid
+ ; isCommutativeMagma to +-isCommutativeMagma
+ ; isCommutativeMonoid to +-isCommutativeMonoid
+ ; isCommutativeSemigroup to +-isCommutativeSemigroup
+ ; isGroup to +-isGroup
+ )
+
+ open IsAlmostGroup *-isAlmostGroup public
+ using (⁻¹-cong; uniqueˡ-⁻¹; uniqueʳ-⁻¹)
+ renaming
+ ( assoc to *-assoc
+ ; ∙-cong to *-cong
+ ; ∙-congˡ to *-congˡ
+ ; ∙-congʳ to *-congʳ
+ ; identity to *-identity
+ ; identityˡ to *-identityˡ
+ ; identityʳ to *-identityʳ
+ ; inverse to ⁻¹-inverse
+ ; inverseˡ to ⁻¹-inverseˡ
+ ; inverseʳ to ⁻¹-inverseʳ
+ ; isMagma to *-isMagma
+ ; isSemigroup to *-isSemigroup
+ ; isMonoid to *-isMonoid
+ )
+
+ isRing : IsRing + _*_ -_ 0# 1#
+ isRing = record
+ { +-isAbelianGroup = +-isAbelianGroup
+ ; *-isMonoid = *-isMonoid
+ ; distrib = distrib
+ ; zero = zero
+ }
+
+ open IsRing isRing public
+ using
+ ( distribˡ ; distribʳ ; zeroˡ ; zeroʳ
+ ; isNearSemiring ; isSemiringWithoutOne ; isSemiringWithoutAnnihilatingZero
+ )
+
+record IsField
+ (+ * : Op₂ A) (-_ : Op₁ A) (0# 1# : A)
+ (⁻¹ : AlmostOp₁ _≈_ 0#) : Set (a ⊔ ℓ) where
+ field
+ isDivisionRing : IsDivisionRing + * -_ 0# 1# ⁻¹
+ *-comm : Commutative *
+
+ open IsDivisionRing isDivisionRing public
+
+ isCommutativeRing : IsCommutativeRing + * -_ 0# 1#
+ isCommutativeRing = record
+ { isRing = isRing
+ ; *-comm = *-comm
+ }
+
+ open IsCommutativeRing isCommutativeRing public
+ using
+ ( isCommutativeSemiring
+ ; isCommutativeSemiringWithoutOne
+ ; *-isCommutativeMagma
+ ; *-isCommutativeSemigroup
+ ; *-isCommutativeMonoid
+ )