{-# OPTIONS --without-K --exact-split --safe #-}
module Fragment.Equational.Theory.Base where
open import Function using (_∘_)
open import Fragment.Algebra.Signature
open import Fragment.Algebra.Free
open import Fragment.Algebra.Algebra
open import Fragment.Algebra.Properties
open import Data.Nat using (ℕ)
open import Data.Fin using (Fin)
open import Data.Product using (_×_; map)
Eq : (Σ : Signature) → (n : ℕ) → Set
Eq Σ n = ∥ F Σ n ∥ × ∥ F Σ n ∥
record Theory : Set₁ where
field
Σ : Signature
eqs : ℕ → Set
_⟦_⟧ₑ : ∀ {arity} → eqs arity → Eq Σ arity
open Signature Σ
open Theory public
data ExtendedEq (Θ : Theory) (E : ℕ → Set) : ℕ → Set where
newₑ : ∀ {n} → E n → ExtendedEq Θ E n
oldₑ : ∀ {n} → eqs Θ n → ExtendedEq Θ E n
_⦅_⦆ₒ : (Θ : Theory) → (O : ℕ → Set) → Theory
Θ ⦅ O ⦆ₒ = record { Σ = (Σ Θ) ⦅ O ⦆
; eqs = eqs Θ
; _⟦_⟧ₑ = (map extend extend) ∘ Θ ⟦_⟧ₑ
}
_⦅_/_⦆ : (Θ : Theory)
→ (E : ℕ → Set)
→ (∀ {n} → E n → Eq (Σ Θ) n)
→ Theory
Θ ⦅ E / ⟦_⟧' ⦆ = record { Σ = Σ Θ
; eqs = ExtendedEq Θ E
; _⟦_⟧ₑ = withE
}
where withE : ∀ {n} → ExtendedEq Θ E n → Eq (Σ Θ) n
withE (newₑ eq) = ⟦ eq ⟧'
withE (oldₑ eq) = Θ ⟦ eq ⟧ₑ
_⦅_∣_/_⦆ : (Θ : Theory)
→ (O : ℕ → Set)
→ (E : ℕ → Set)
→ (∀ {n} → E n → Eq ((Σ Θ) ⦅ O ⦆) n)
→ Theory
Θ ⦅ O ∣ E / ⟦_⟧' ⦆ = (Θ ⦅ O ⦆ₒ) ⦅ E / ⟦_⟧' ⦆