{-# OPTIONS --without-K --exact-split --safe #-}
open import Fragment.Equational.Theory
module Fragment.Equational.Model.Properties (Θ : Theory) where
open import Fragment.Equational.Model.Base Θ
open import Fragment.Equational.Model.Synthetic Θ
open import Fragment.Algebra.Homomorphism (Σ Θ)
open import Fragment.Algebra.Free (Σ Θ)
open import Fragment.Setoid.Morphism using (_↝_)
open import Level using (Level)
open import Function using (_∘_)
open import Data.Nat using (ℕ; zero; suc)
open import Data.Fin using (Fin; zero; suc; fromℕ)
open import Data.Vec using (Vec; []; _∷_; map)
open import Data.Product using (proj₁; proj₂)
open import Data.Vec.Relation.Binary.Pointwise.Inductive
using (Pointwise; []; _∷_)
open import Relation.Binary using (Setoid)
import Relation.Binary.Reasoning.Setoid as Reasoning
private
variable
a ℓ : Level
module _ {n} (A : Model {a} {ℓ}) (θ : Env ∥ A ∥ₐ n) where
private
module S = Setoid ∥ A ∥/≈
open Reasoning ∥ A ∥/≈
mutual
map-∣interp∣-cong : ∀ {m} {xs ys : Vec ∥ J n ∥ m}
→ Pointwise ≈[ J n ] xs ys
→ Pointwise ≈[ A ] (map ∣ inst ∥ A ∥ₐ θ ∣ xs)
(map ∣ inst ∥ A ∥ₐ θ ∣ ys)
map-∣interp∣-cong [] = []
map-∣interp∣-cong (p ∷ ps) = ∣interp∣-cong p ∷ map-∣interp∣-cong ps
∣interp∣-cong : Congruent ≈[ J n ] ≈[ A ] ∣ inst ∥ A ∥ₐ θ ∣
∣interp∣-cong refl = S.refl
∣interp∣-cong (sym p) = S.sym (∣interp∣-cong p)
∣interp∣-cong (trans p q) = S.trans (∣interp∣-cong p) (∣interp∣-cong q)
∣interp∣-cong (inherit p) = ∣ inst ∥ A ∥ₐ θ ∣-cong p
∣interp∣-cong (cong f {xs = xs} {ys = ys} ps) = begin
∣ inst ∥ A ∥ₐ θ ∣ (term f xs)
≈⟨ S.sym (∣ inst ∥ A ∥ₐ θ ∣-hom f xs) ⟩
A ⟦ f ⟧ (map ∣ inst ∥ A ∥ₐ θ ∣ xs)
≈⟨ (A ⟦ f ⟧-cong) (map-∣interp∣-cong ps) ⟩
A ⟦ f ⟧ (map ∣ inst ∥ A ∥ₐ θ ∣ ys)
≈⟨ ∣ inst ∥ A ∥ₐ θ ∣-hom f ys ⟩
∣ inst ∥ A ∥ₐ θ ∣ (term f ys)
∎
∣interp∣-cong (axiom eq θ') = begin
∣ inst ∥ A ∥ₐ θ ∣ (∣ inst (F n) θ' ∣ lhs)
≈⟨ inst-assoc (F n) θ' (inst ∥ A ∥ₐ θ) {x = lhs} ⟩
∣ inst ∥ A ∥ₐ (∣ inst ∥ A ∥ₐ θ ∣ ∘ θ') ∣ lhs
≈⟨ ∥ A ∥ₐ-models eq _ ⟩
∣ inst ∥ A ∥ₐ (∣ inst ∥ A ∥ₐ θ ∣ ∘ θ') ∣ rhs
≈⟨ S.sym (inst-assoc (F n) θ' (inst ∥ A ∥ₐ θ) {x = rhs}) ⟩
∣ inst ∥ A ∥ₐ θ ∣ (∣ inst (F n) θ' ∣ rhs)
∎
where lhs = proj₁ (Θ ⟦ eq ⟧ₑ)
rhs = proj₂ (Θ ⟦ eq ⟧ₑ)
∣interp∣⃗ : ∥ J n ∥/≈ ↝ ∥ A ∥/≈
∣interp∣⃗ = record { ∣_∣ = ∣ inst ∥ A ∥ₐ θ ∣
; ∣_∣-cong = ∣interp∣-cong
}
interp : ∥ J n ∥ₐ ⟿ ∥ A ∥ₐ
interp = record { ∣_∣⃗ = ∣interp∣⃗
; ∣_∣-hom = ∣ inst ∥ A ∥ₐ θ ∣-hom
}
atomise : (n : ℕ) → ∥ J (suc n) ∥
atomise n = atom (dyn (fromℕ n))
up : ∀ {n} → Fin n → Fin (suc n)
up zero = zero
up (suc n) = suc (up n)
raise : ∀ {n} → ∥ J n ∥ₐ ⟿ ∥ J (suc n) ∥ₐ
raise {n} = interp (J (suc n)) (λ k → atom (dyn (up k)))
step : ∀ {n} → ∥ J n ∥ₐ ⟿ ∥ J (suc n) ∥ₐ
step {n} = interp (J (suc n)) (λ k → atom (dyn (suc k)))
mutual
map-step-raise : ∀ {n m} → (xs : Vec ∥ J n ∥ m)
→ Pointwise ≈[ J (suc (suc n)) ]
(map ∣ step {suc n} ⊙ raise {n} ∣ xs)
(map ∣ raise {suc n} ⊙ step {n} ∣ xs)
map-step-raise [] = []
map-step-raise (x ∷ xs) = step-raise {x = x} ∷ map-step-raise xs
step-raise : ∀ {n} → step {suc n} ⊙ raise {n} ≗ raise {suc n} ⊙ step {n}
step-raise {n} {atom (dyn k)} = refl
step-raise {n} {term f xs} = begin
∣ step ⊙ raise ∣ (term f xs)
≈⟨ sym (∣ step ⊙ raise ∣-hom f xs) ⟩
term f (map ∣ step ⊙ raise ∣ xs)
≈⟨ cong f (map-step-raise xs) ⟩
term f (map ∣ raise ⊙ step ∣ xs)
≈⟨ ∣ raise ⊙ step ∣-hom f xs ⟩
∣ raise ⊙ step ∣ (term f xs)
∎
where open Reasoning ∥ J (suc (suc n)) ∥/≈