{-# OPTIONS --without-K --exact-split --safe #-}
open import Fragment.Equational.Theory
module Fragment.Equational.Model.Synthetic (Θ : Theory) where
open import Fragment.Algebra.Signature
open import Fragment.Algebra.Algebra (Σ Θ)
open import Fragment.Algebra.Free (Σ Θ)
open import Fragment.Algebra.Homomorphism (Σ Θ)
open import Fragment.Algebra.Quotient (Σ Θ)
open import Fragment.Equational.Model.Base Θ
using (Model; IsModel; Models)
open import Fragment.Setoid.Morphism using (_·_)
open import Level using (Level; _⊔_)
open import Function using (_∘_)
open import Data.Empty using (⊥)
open import Data.Nat using (ℕ)
open import Data.Product using (proj₁; proj₂)
open import Data.Vec using (map)
open import Data.Vec.Relation.Binary.Pointwise.Inductive
using (Pointwise; []; _∷_)
open import Relation.Binary using (Setoid; IsEquivalence)
import Relation.Binary.PropositionalEquality as PE
private
variable
a ℓ : Level
module _ (A : Algebra {a} {ℓ}) where
infix 4 _≊_
data _≊_ : ∥ A ∥ → ∥ A ∥ → Set (a ⊔ ℓ) where
refl : ∀ {x} → x ≊ x
sym : ∀ {x y} → x ≊ y → y ≊ x
trans : ∀ {x y z} → x ≊ y → y ≊ z → x ≊ z
inherit : ∀ {x y} → x =[ A ] y → x ≊ y
cong : ∀ {n} → (f : ops (Σ Θ) n)
→ ∀ {xs ys} → Pointwise _≊_ xs ys
→ A ⟦ f ⟧ xs ≊ A ⟦ f ⟧ ys
axiom : ∀ {n} → (eq : eqs Θ n) → (θ : Env A n)
→ ∣ inst A θ ∣ (proj₁ (Θ ⟦ eq ⟧ₑ))
≊ ∣ inst A θ ∣ (proj₂ (Θ ⟦ eq ⟧ₑ))
private
≊-isEquivalence : IsEquivalence _≊_
≊-isEquivalence = record { refl = refl
; sym = sym
; trans = trans
}
instance
≊-isDenom : IsDenominator A _≊_
≊-isDenom = record { isEquivalence = ≊-isEquivalence
; isCompatible = cong
; isCoarser = inherit
}
Synthetic : Model
Synthetic = record { ∥_∥/≈ = ∥ A ∥/ _≊_
; isModel = isModel
}
where open module T = Setoid (∥ A ∥/ _≊_)
open import Relation.Binary.Reasoning.Setoid (∥ A ∥/ _≊_)
models : Models (A / _≊_)
models eq θ = begin
∣ inst (A / _≊_) θ ∣ lhs
≈⟨ T.sym (lemma {x = lhs}) ⟩
∣ (inc A _≊_) ⊙ (inst A θ) ∣ lhs
≈⟨ axiom eq θ ⟩
∣ (inc A _≊_) ⊙ (inst A θ) ∣ rhs
≈⟨ lemma {x = rhs} ⟩
∣ inst (A / _≊_) θ ∣ rhs
∎
where lhs = proj₁ (Θ ⟦ eq ⟧ₑ)
rhs = proj₂ (Θ ⟦ eq ⟧ₑ)
lemma = inst-universal (A / _≊_) θ
{h = (inc A _≊_) ⊙ (inst A θ) }
(λ x → PE.refl)
isModel : IsModel (∥ A ∥/ _≊_)
isModel = record { isAlgebra = A / _≊_ -isAlgebra
; models = models
}
J : ℕ → Model
J = Synthetic ∘ F