{-# OPTIONS --without-K --exact-split --safe #-} open import Fragment.Equational.Theory module Fragment.Equational.FreeExtension.Properties (Θ : Theory) where open import Fragment.Algebra.Algebra (Σ Θ) using (Algebra) open import Fragment.Algebra.Homomorphism (Σ Θ) open import Fragment.Algebra.Free (Σ Θ) open import Fragment.Equational.Model Θ open import Fragment.Equational.Coproduct Θ open import Fragment.Equational.FreeExtension.Base Θ open import Fragment.Equational.FreeExtension.Synthetic Θ using (SynFrex) open import Level using (Level) open import Data.Nat using (ℕ) open import Data.Vec using (Vec) open import Relation.Binary using (Setoid) import Relation.Binary.Reasoning.Setoid as Reasoning private variable a ℓ₁ : Level module _ (X : FreeExtension) (Y : FreeExtension) (A : Model {a} {ℓ₁}) (n : ℕ) where open FreeExtension X renaming (_[_] to _[_]₁; _[_]-isFrex to _[_]₁-isFrex) open FreeExtension Y renaming (_[_] to _[_]₂; _[_]-isFrex to _[_]₂-isFrex) open IsCoproduct (A [ n ]₁-isFrex) renaming (inl to inl₁; inr to inr₁; _[_,_] to _[_,_]₁; commute₁ to commute₁₁; commute₂ to commute₂₁) open IsCoproduct (A [ n ]₂-isFrex) renaming (inl to inl₂; inr to inr₂; _[_,_] to _[_,_]₂; commute₁ to commute₁₂; commute₂ to commute₂₂) using () to : ∥ A [ n ]₂ ∥ₐ ⟿ ∥ A [ n ]₁ ∥ₐ to = (A [ n ]₁) [ inl₁ , inr₁ ]₂ from : ∥ A [ n ]₁ ∥ₐ ⟿ ∥ A [ n ]₂ ∥ₐ from = (A [ n ]₂) [ inl₂ , inr₂ ]₁ inv : to ⊙ from ≗ id inv = begin to ⊙ from ≈⟨ ≗-sym {f = (A [ n ]₁) [ inl₁ , inr₁ ]₁} {g = to ⊙ from} (universal {h = to ⊙ from} c₁ c₂) ⟩ (A [ n ]₁) [ inl₁ , inr₁ ]₁ ≈⟨ universal {h = id} (id-unitˡ {f = inl₁}) (id-unitˡ {f = inr₁}) ⟩ id ∎ where c₁ : (to ⊙ from) ⊙ inl₁ ≗ inl₁ c₁ = begin (to ⊙ from) ⊙ inl₁ ≈⟨ ⊙-assoc to from inl₁ ⟩ to ⊙ (from ⊙ inl₁) ≈⟨ ⊙-congˡ to (from ⊙ inl₁) inl₂ (commute₁₁ {f = inl₂} {g = inr₂}) ⟩ to ⊙ inl₂ ≈⟨ commute₁₂ {X = A [ n ]₁} {f = inl₁} {g = inr₁} ⟩ inl₁ ∎ where open Reasoning (∥ A ∥ₐ ⟿ ∥ A [ n ]₁ ∥ₐ /≗) c₂ : (to ⊙ from) ⊙ inr₁ ≗ inr₁ c₂ = begin (to ⊙ from) ⊙ inr₁ ≈⟨ ⊙-assoc to from inr₁ ⟩ to ⊙ (from ⊙ inr₁) ≈⟨ ⊙-congˡ to (from ⊙ inr₁) inr₂ (commute₂₁ {f = inl₂} {g = inr₂}) ⟩ to ⊙ inr₂ ≈⟨ commute₂₂ {X = A [ n ]₁} {f = inl₁} {g = inr₁} ⟩ inr₁ ∎ where open Reasoning (∥ J n ∥ₐ ⟿ ∥ A [ n ]₁ ∥ₐ /≗) open Reasoning (∥ A [ n ]₁ ∥ₐ ⟿ ∥ A [ n ]₁ ∥ₐ /≗) module _ (X : FreeExtension) (Y : FreeExtension) (A : Model {a} {ℓ₁}) (n : ℕ) where open FreeExtension X renaming (_[_] to _[_]₁) open FreeExtension Y renaming (_[_] to _[_]₂) iso : ∥ A [ n ]₁ ∥ₐ ≃ ∥ A [ n ]₂ ∥ₐ iso = record { _⃗ = to Y X A n ; _⃖ = from Y X A n ; invˡ = inv Y X A n ; invʳ = inv X Y A n } module _ (X : FreeExtension) (A : Model {a} {ℓ₁}) {n : ℕ} where open FreeExtension X open FreeExtension SynFrex renaming (_[_] to _[_]ₛ; _[_]-isFrex to _[_]ₛ-isFrex) open IsCoproduct (A [ n ]-isFrex) open IsCoproduct (A [ n ]ₛ-isFrex) renaming (_[_,_] to _[_,_]ₛ) using () open Setoid ∥ A [ n ] ∥/≈ renaming (_≈_ to _≋_) open Setoid ∥ A ∥/≈ using (_≈_) norm = to X SynFrex A n syn = from X SynFrex A n reduce : (θ : Env ∥ A ∥ₐ n) → ∥ A [ n ]ₛ ∥ₐ ⟿ ∥ A ∥ₐ reduce θ = A [ id , interp A θ ]ₛ module _ (Γ : Vec ∥ A ∥ n) where private θ : Env ∥ A ∥ₐ n θ = env {A = ∥ A ∥ₐ} Γ frexify : ∀ {lhs rhs : Term (BT ∥ A ∥ n)} → ∣ norm ∣ lhs ≋ ∣ norm ∣ rhs → ∣ reduce θ ∣ lhs ≈ ∣ reduce θ ∣ rhs frexify {lhs = lhs} {rhs = rhs} p = begin ∣ reduce θ ∣ lhs ≈⟨ Setoid.sym ∥ A ∥/≈ (∣ reduce θ ∣-cong (inv SynFrex X A n {x = lhs})) ⟩ ∣ reduce θ ∣ (∣ syn ∣ (∣ norm ∣ lhs)) ≈⟨ ∣ reduce θ ∣-cong (∣ syn ∣-cong p) ⟩ ∣ reduce θ ∣ (∣ syn ∣ (∣ norm ∣ rhs)) ≈⟨ ∣ reduce θ ∣-cong (inv SynFrex X A n {x = rhs}) ⟩ ∣ reduce θ ∣ rhs ∎ where open Reasoning ∥ A ∥/≈