Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pointwise Algebra #2381

Merged
merged 6 commits into from
May 15, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,11 @@ Deprecated names
New modules
-----------

* Pointwise algebraic structures and bundles:
```
Algebra.Construct.Pointwise
```

* Raw bundles for module-like algebraic structures:
```
Algebra.Module.Bundles.Raw
Expand Down
224 changes: 224 additions & 0 deletions src/Algebra/Construct/Pointwise.agda
Original file line number Diff line number Diff line change
@@ -0,0 +1,224 @@
------------------------------------------------------------------------
-- The Agda standard library
--
-- For each `IsX` algebraic structure `S`, lift the structure to the
-- 'pointwise' function space `A → S`: categorically, this is the
-- *power* object in the relevant category of `X` objects and morphisms
--
-- NB the module is parametrised only wrt `A`
------------------------------------------------------------------------

{-# OPTIONS --cubical-compatible --safe #-}

module Algebra.Construct.Pointwise {a} (A : Set a) where

open import Algebra.Bundles
open import Algebra.Core using (Op₁; Op₂)
open import Algebra.Structures
open import Data.Product.Base using (_,_)
open import Function.Base using (id; _∘′_; const)
open import Level
open import Relation.Binary.Core using (Rel)
open import Relation.Binary.Bundles using (Setoid)
open import Relation.Binary.Structures using (IsEquivalence)


private

variable
c ℓ : Level
C : Set c
_≈_ : Rel C ℓ
ε 0# 1# : C
_⁻¹ -_ : Op₁ C
_∙_ _+_ _*_ : Op₂ C

lift₀ : C → A → C
lift₀ = const

lift₁ : Op₁ C → Op₁ (A → C)
lift₁ = _∘′_

lift₂ : Op₂ C → Op₂ (A → C)
lift₂ _∙_ g h x = (g x) ∙ (h x)

liftRel : Rel C ℓ → Rel (A → C) (a ⊔ ℓ)
liftRel _≈_ g h = ∀ x → (g x) ≈ (h x)


------------------------------------------------------------------------
-- Setoid structure: here rather than elsewhere? (could be imported?)

module _ (isEquivalenceC : IsEquivalence _≈_) where

open IsEquivalence isEquivalenceC

isEquivalence : IsEquivalence (liftRel _≈_)
isEquivalence = record
{ refl = λ {f} x → refl {f x}
; sym = λ f≈g x → sym (f≈g x)
; trans = λ f≈g g≈h x → trans (f≈g x) (g≈h x)
}

------------------------------------------------------------------------
-- Structures

module _ (isMagmaC : IsMagma _≈_ _∙_) where

private
module M = IsMagma isMagmaC

isMagma : IsMagma (liftRel _≈_) (lift₂ _∙_)
isMagma = record
{ isEquivalence = isEquivalence M.isEquivalence
; ∙-cong = λ g h x → M.∙-cong (g x) (h x)
}

module _ (isSemigroupC : IsSemigroup _≈_ _∙_) where

private
module M = IsSemigroup isSemigroupC

isSemigroup : IsSemigroup (liftRel _≈_) (lift₂ _∙_)
isSemigroup = record
{ isMagma = isMagma M.isMagma
; assoc = λ f g h x → M.assoc (f x) (g x) (h x)
}

module _ (isBandC : IsBand _≈_ _∙_) where

private
module M = IsBand isBandC

isBand : IsBand (liftRel _≈_) (lift₂ _∙_)
isBand = record
{ isSemigroup = isSemigroup M.isSemigroup
; idem = λ f x → M.idem (f x)
}

module _ (isCommutativeSemigroupC : IsCommutativeSemigroup _≈_ _∙_) where

private
module M = IsCommutativeSemigroup isCommutativeSemigroupC

isCommutativeSemigroup : IsCommutativeSemigroup (liftRel _≈_) (lift₂ _∙_)
isCommutativeSemigroup = record
{ isSemigroup = isSemigroup M.isSemigroup
; comm = λ f g x → M.comm (f x) (g x)
}

module _ (isMonoidC : IsMonoid _≈_ _∙_ ε) where

private
module M = IsMonoid isMonoidC

isMonoid : IsMonoid (liftRel _≈_) (lift₂ _∙_) (lift₀ ε)
isMonoid = record
{ isSemigroup = isSemigroup M.isSemigroup
; identity = (λ f x → M.identityˡ (f x)) , λ f x → M.identityʳ (f x)
}

module _ (isCommutativeMonoidC : IsCommutativeMonoid _≈_ _∙_ ε) where

private
module M = IsCommutativeMonoid isCommutativeMonoidC

isCommutativeMonoid : IsCommutativeMonoid (liftRel _≈_) (lift₂ _∙_) (lift₀ ε)
isCommutativeMonoid = record
{ isMonoid = isMonoid M.isMonoid
; comm = λ f g x → M.comm (f x) (g x)
}

module _ (isGroupC : IsGroup _≈_ _∙_ ε _⁻¹) where

private
module M = IsGroup isGroupC

isGroup : IsGroup (liftRel _≈_) (lift₂ _∙_) (lift₀ ε) (lift₁ _⁻¹)
isGroup = record
{ isMonoid = isMonoid M.isMonoid
; inverse = (λ f x → M.inverseˡ (f x)) , λ f x → M.inverseʳ (f x)
; ⁻¹-cong = λ f x → M.⁻¹-cong (f x)
}

module _ (isAbelianGroupC : IsAbelianGroup _≈_ _∙_ ε _⁻¹) where

private
module M = IsAbelianGroup isAbelianGroupC

isAbelianGroup : IsAbelianGroup (liftRel _≈_) (lift₂ _∙_) (lift₀ ε) (lift₁ _⁻¹)
isAbelianGroup = record
{ isGroup = isGroup M.isGroup
; comm = λ f g x → M.comm (f x) (g x)
}

module _ (isSemiringWithoutAnnihilatingZeroC : IsSemiringWithoutAnnihilatingZero _≈_ _+_ _*_ 0# 1#) where

private
module M = IsSemiringWithoutAnnihilatingZero isSemiringWithoutAnnihilatingZeroC

isSemiringWithoutAnnihilatingZero : IsSemiringWithoutAnnihilatingZero (liftRel _≈_) (lift₂ _+_) (lift₂ _*_) (lift₀ 0#) (lift₀ 1#)
isSemiringWithoutAnnihilatingZero = record
{ +-isCommutativeMonoid = isCommutativeMonoid M.+-isCommutativeMonoid
; *-cong = λ g h x → M.*-cong (g x) (h x)
; *-assoc = λ f g h x → M.*-assoc (f x) (g x) (h x)
; *-identity = (λ f x → M.*-identityˡ (f x)) , λ f x → M.*-identityʳ (f x)
; distrib = (λ f g h x → M.distribˡ (f x) (g x) (h x)) , λ f g h x → M.distribʳ (f x) (g x) (h x)
}

module _ (isSemiringC : IsSemiring _≈_ _+_ _*_ 0# 1#) where

private
module M = IsSemiring isSemiringC

isSemiring : IsSemiring (liftRel _≈_) (lift₂ _+_) (lift₂ _*_) (lift₀ 0#) (lift₀ 1#)
isSemiring = record
{ isSemiringWithoutAnnihilatingZero = isSemiringWithoutAnnihilatingZero M.isSemiringWithoutAnnihilatingZero
; zero = (λ f x → M.zeroˡ (f x)) , λ f x → M.zeroʳ (f x)
}

module _ (isRingC : IsRing _≈_ _+_ _*_ -_ 0# 1#) where

private
module M = IsRing isRingC

isRing : IsRing (liftRel _≈_) (lift₂ _+_) (lift₂ _*_) (lift₁ -_) (lift₀ 0#) (lift₀ 1#)
isRing = record
{ +-isAbelianGroup = isAbelianGroup M.+-isAbelianGroup
; *-cong = λ g h x → M.*-cong (g x) (h x)
; *-assoc = λ f g h x → M.*-assoc (f x) (g x) (h x)
; *-identity = (λ f x → M.*-identityˡ (f x)) , λ f x → M.*-identityʳ (f x)
; distrib = (λ f g h x → M.distribˡ (f x) (g x) (h x)) , λ f g h x → M.distribʳ (f x) (g x) (h x)
}


------------------------------------------------------------------------
-- Bundles

magma : Magma c ℓ → Magma (a ⊔ c) (a ⊔ ℓ)
magma m = record { isMagma = isMagma (Magma.isMagma m) }

semigroup : Semigroup c ℓ → Semigroup (a ⊔ c) (a ⊔ ℓ)
semigroup m = record { isSemigroup = isSemigroup (Semigroup.isSemigroup m) }

band : Band c ℓ → Band (a ⊔ c) (a ⊔ ℓ)
band m = record { isBand = isBand (Band.isBand m) }

commutativeSemigroup : CommutativeSemigroup c ℓ → CommutativeSemigroup (a ⊔ c) (a ⊔ ℓ)
commutativeSemigroup m = record { isCommutativeSemigroup = isCommutativeSemigroup (CommutativeSemigroup.isCommutativeSemigroup m) }

monoid : Monoid c ℓ → Monoid (a ⊔ c) (a ⊔ ℓ)
monoid m = record { isMonoid = isMonoid (Monoid.isMonoid m) }

group : Group c ℓ → Group (a ⊔ c) (a ⊔ ℓ)
group m = record { isGroup = isGroup (Group.isGroup m) }

abelianGroup : AbelianGroup c ℓ → AbelianGroup (a ⊔ c) (a ⊔ ℓ)
abelianGroup m = record { isAbelianGroup = isAbelianGroup (AbelianGroup.isAbelianGroup m) }

semiring : Semiring c ℓ → Semiring (a ⊔ c) (a ⊔ ℓ)
semiring m = record { isSemiring = isSemiring (Semiring.isSemiring m) }

ring : Ring c ℓ → Ring (a ⊔ c) (a ⊔ ℓ)
ring m = record { isRing = isRing (Ring.isRing m) }

Loading