{-# OPTIONS --without-K --exact-split --safe #-}
open import Fragment.Algebra.Signature
module Fragment.Algebra.Properties where
open import Fragment.Algebra.Algebra
open import Fragment.Algebra.Free
open import Level using (Level)
open import Data.Nat using (ℕ)
open import Data.Vec using (Vec; []; _∷_)
private
variable
a ℓ : Level
mutual
map-extend : ∀ {Σ O a n} → {A : Set a}
→ Vec (Term Σ A) n
→ Vec (Term (Σ ⦅ O ⦆) A) n
map-extend [] = []
map-extend (x ∷ xs) = extend x ∷ map-extend xs
extend : ∀ {Σ O} → {A : Set a}
→ Term Σ A → Term (Σ ⦅ O ⦆) A
extend (atom x) = atom x
extend (term f xs) = term (oldₒ f) (map-extend xs)
forgetₒ : ∀ {Σ O} → Algebra (Σ ⦅ O ⦆) {a} {ℓ} → Algebra Σ {a} {ℓ}
forgetₒ {Σ = Σ} A = record { ∥_∥/≈ = ∥ A ∥/≈
; ∥_∥/≈-isAlgebra = forget-isAlgebra
}
where forget-⟦_⟧ : Interpretation Σ ∥ A ∥/≈
forget-⟦ f ⟧ x = A ⟦ oldₒ f ⟧ x
forget-⟦⟧-cong : Congruence Σ ∥ A ∥/≈ forget-⟦_⟧
forget-⟦⟧-cong f x = (A ⟦ oldₒ f ⟧-cong) x
forget-isAlgebra : IsAlgebra Σ ∥ A ∥/≈
forget-isAlgebra = record { ⟦_⟧ = forget-⟦_⟧
; ⟦⟧-cong = forget-⟦⟧-cong
}