{-# OPTIONS --without-K --exact-split --safe #-}
open import Fragment.Algebra.Signature
module Fragment.Algebra.Algebra (Σ : Signature) where
open import Level using (Level; _⊔_; suc)
open import Data.Vec using (Vec)
open import Data.Vec.Relation.Binary.Pointwise.Inductive using (Pointwise)
open import Relation.Binary using (Setoid; Rel; IsEquivalence)
private
variable
a ℓ : Level
module _ (S : Setoid a ℓ) where
open import Data.Vec.Relation.Binary.Equality.Setoid S using (_≋_)
open Setoid S renaming (Carrier to A)
Interpretation : Set a
Interpretation = ∀ {arity} → (f : ops Σ arity) → Vec A arity → A
Congruence : Interpretation → Set (a ⊔ ℓ)
Congruence ⟦_⟧ = ∀ {arity}
→ (f : ops Σ arity)
→ ∀ {xs ys} → Pointwise _≈_ xs ys → ⟦ f ⟧ xs ≈ ⟦ f ⟧ ys
record IsAlgebra : Set (a ⊔ ℓ) where
field
⟦_⟧ : Interpretation
⟦⟧-cong : Congruence ⟦_⟧
record Algebra : Set (suc a ⊔ suc ℓ) where
constructor algebra
field
∥_∥/≈ : Setoid a ℓ
∥_∥/≈-isAlgebra : IsAlgebra ∥_∥/≈
∥_∥ : Set a
∥_∥ = Setoid.Carrier ∥_∥/≈
infix 10 _⟦_⟧_
_⟦_⟧_ : Interpretation (∥_∥/≈)
_⟦_⟧_ = IsAlgebra.⟦_⟧ ∥_∥/≈-isAlgebra
_⟦_⟧-cong : Congruence (∥_∥/≈) (_⟦_⟧_)
_⟦_⟧-cong = IsAlgebra.⟦⟧-cong ∥_∥/≈-isAlgebra
≈[_] : Rel ∥_∥ ℓ
≈[_] = Setoid._≈_ ∥_∥/≈
≈[_]-isEquivalence : IsEquivalence ≈[_]
≈[_]-isEquivalence = Setoid.isEquivalence ∥_∥/≈
open Algebra public
infix 5 ≈-syntax
≈-syntax : (A : Algebra {a} {ℓ}) → ∥ A ∥ → ∥ A ∥ → Set ℓ
≈-syntax A x y = Setoid._≈_ ∥ A ∥/≈ x y
syntax ≈-syntax A x y = x =[ A ] y