{-# OPTIONS --without-K --exact-split --safe #-}
module Fragment.Equational.Structures where
import Fragment.Equational.Theory.Laws as L
open import Fragment.Equational.Theory
open import Fragment.Equational.Theory.Bundles
open import Fragment.Equational.Model
open import Fragment.Algebra.Algebra
open import Level using (Level)
open import Data.Fin using (Fin; #_; suc; zero)
open import Data.Vec using ([]; _∷_)
open import Data.Vec.Relation.Binary.Pointwise.Inductive using ([]; _∷_)
open import Relation.Binary using (Setoid; Rel)
open import Algebra.Core
private
variable
a ℓ : Level
module _ {A : Set a} {_≈_ : Rel A ℓ} where
open import Algebra.Definitions _≈_
open import Algebra.Structures _≈_
module _ {_•_ : Op₂ A} where
module _ (isMagma : IsMagma _•_) where
open IsMagma isMagma
magma→setoid : Setoid a ℓ
magma→setoid = record { Carrier = A
; _≈_ = _≈_
; isEquivalence = isEquivalence
}
private
magma→⟦⟧ : Interpretation Σ-magma magma→setoid
magma→⟦⟧ MagmaOp.• (x ∷ y ∷ []) = _•_ x y
magma→⟦⟧-cong : Congruent₂ _•_ → Congruence Σ-magma magma→setoid magma→⟦⟧
magma→⟦⟧-cong c MagmaOp.• (x₁≈x₂ ∷ y₁≈y₂ ∷ []) = c x₁≈x₂ y₁≈y₂
magma→isAlgebra : IsAlgebra Σ-magma magma→setoid
magma→isAlgebra = record { ⟦_⟧ = magma→⟦⟧
; ⟦⟧-cong = magma→⟦⟧-cong ∙-cong
}
magma→algebra : Algebra Σ-magma
magma→algebra = record { ∥_∥/≈ = magma→setoid
; ∥_∥/≈-isAlgebra = magma→isAlgebra
}
private
magma→models : Models Θ-magma magma→algebra
magma→models ()
magma→isModel : IsModel Θ-magma magma→setoid
magma→isModel = record { isAlgebra = magma→isAlgebra
; models = magma→models
}
magma→model : Model Θ-magma
magma→model = record { ∥_∥/≈ = magma→setoid
; isModel = magma→isModel
}
module _ (isSemigroup : IsSemigroup _•_) where
private
open IsSemigroup isSemigroup renaming (assoc to •-assoc)
semigroup→models : Models Θ-semigroup (magma→algebra isMagma)
semigroup→models assoc θ = •-assoc (θ (# 0)) (θ (# 1)) (θ (# 2))
semigroup→isModel : IsModel Θ-semigroup (magma→setoid isMagma)
semigroup→isModel = record { isAlgebra = magma→isAlgebra isMagma
; models = semigroup→models
}
semigroup→model : Model Θ-semigroup
semigroup→model = record { ∥_∥/≈ = magma→setoid isMagma
; isModel = semigroup→isModel
}
module _ (isCSemigroup : IsCommutativeSemigroup _•_) where
private
open IsCommutativeSemigroup isCSemigroup
renaming (comm to •-comm; assoc to •-assoc)
csemigroup→models : Models Θ-csemigroup (magma→algebra isMagma)
csemigroup→models comm θ = •-comm (θ (# 0)) (θ (# 1))
csemigroup→models assoc θ = •-assoc (θ (# 0)) (θ (# 1)) (θ (# 2))
csemigroup→isModel : IsModel Θ-csemigroup (magma→setoid isMagma)
csemigroup→isModel = record { isAlgebra = magma→isAlgebra isMagma
; models = csemigroup→models
}
csemigroup→model : Model Θ-csemigroup
csemigroup→model = record { ∥_∥/≈ = magma→setoid isMagma
; isModel = csemigroup→isModel
}