{-# OPTIONS --safe #-}
open import Prelude
open import FreeMonad.PackagedTheory
open import Signatures
open import FinitenessConditions
open import FreeMonad.Theory
module FreeMonad.Combinations.Quotient
{ℓ}
(T : FullTheory ℓ)
(𝒯′ : Theory (FullTheory.𝔽 T) ℓ)
(finVars′ : FiniteVars 𝒯′)
where
open FullTheory T renaming (𝒯 to 𝒯″)
𝒯 : Theory 𝔽 ℓ
𝒯 .Theory.Laws = 𝒯″ .Theory.Laws ⊎ 𝒯′ .Theory.Laws
𝒯 .Theory.Eqns = 𝒯″ .Theory.Eqns ▿ 𝒯′ .Theory.Eqns
finVars : FiniteVars 𝒯
finVars (inl x) = finiteVars x
finVars (inr x) = finVars′ x
combinedTheory : FullTheory ℓ
combinedTheory .FullTheory.𝔽 = 𝔽
combinedTheory .FullTheory.𝒯 = 𝒯
combinedTheory .FullTheory.finiteArity = finiteArity
combinedTheory .FullTheory.finiteVars = finVars
open import FreeMonad.Quotiented combinedTheory
import FreeMonad.Quotiented T as F′
open import FreeMonad.Syntax
embed : F′.Term A → Term A
embed = rec/ squash/ [_] (λ xs ys r → eq/ xs ys (resp r))
where
resp : {xs ys : Syntax 𝔽 A} → xs F′.~ₜ ys → xs ~ₜ ys
resp (reflₜ x) = reflₜ x
resp (symₜ r) = symₜ (resp r)
resp (transₜ p q) = transₜ (resp p) (resp q)
resp (congₜ Oᵢ kₗ kᵣ x) = congₜ Oᵢ kₗ kᵣ λ i → resp (x i)
resp (eqₜ i g k) = eqₜ (inl i) g k
resp (truncₜ p q i) = truncₜ (resp p) (resp q) i