{-# OPTIONS --safe --sized-types #-} module Generic.Semantics where open import Size open import Data.List.Base as L hiding (lookup ; [_]) open import Data.Var hiding (z; s) open import Data.Var.Varlike using (VarLike; base) open import Data.Relation open import Relation.Unary open import Data.Environment open import Function using (flip) open import Generic.Syntax private variable I : Set σ : I Γ Δ : List I s : Size d : Desc I module _ {d : Desc I} where _─Comp : List I → I ─Scoped → List I → Set (Γ ─Comp) 𝓒 Δ = ∀ {s σ} → Tm d s σ Γ → 𝓒 σ Δ private module DISPLAYONLY where record Semantics (d : Desc I) (𝓥 𝓒 : I ─Scoped) : Set where field th^𝓥 : Thinnable (𝓥 σ) var : ∀[ 𝓥 σ ⇒ 𝓒 σ ] alg : ∀[ ⟦ d ⟧ (Kripke 𝓥 𝓒) σ ⇒ 𝓒 σ ] record Semantics (d : Desc I) (𝓥 𝓒 : I ─Scoped) : Set where field th^𝓥 : Thinnable (𝓥 σ) var : ∀[ 𝓥 σ ⇒ 𝓒 σ ] alg : ∀[ ⟦ d ⟧ (Kripke 𝓥 𝓒) σ ⇒ 𝓒 σ ] semantics : (Γ ─Env) 𝓥 Δ → (Γ ─Comp) 𝓒 Δ body : (Γ ─Env) 𝓥 Δ → ∀ Θ σ → Scope (Tm d s) Θ σ Γ → Kripke 𝓥 𝓒 Θ σ Δ semantics ρ (`var k) = var (lookup ρ k) semantics ρ (`con t) = alg (fmap d (body ρ) t) body ρ [] i t = semantics ρ t body ρ (_ ∷ _) i t = λ σ vs → semantics (vs >> th^Env th^𝓥 ρ σ) t ◇-sem : (Γ ─◇Env) 𝓥 Δ → (Γ ─Comp) 𝓒 Δ ◇-body : (Γ ─◇Env) 𝓥 Δ → ∀ Θ σ → Scope (Tm d s) Θ σ Γ → Kripke 𝓥 𝓒 Θ σ Δ ◇-sem ρ (`var k) = var (DI.run th^𝓥 (slookup ρ k)) ◇-sem ρ (`con t) = alg (fmap d (◇-body ρ) t) ◇-body ρ [] i t = ◇-sem ρ t ◇-body ρ Δ@(_ ∷ _) i t = λ σ vs → ◇-sem (Δ ⊣ vs ,, ρ ◃ σ) t closed : TM d σ → 𝓒 σ [] closed = semantics ε eval : VarLike 𝓥 → ∀[ Tm d s σ ⇒ 𝓒 σ ] eval vl^𝓥 = semantics (base vl^𝓥)