{-# OPTIONS --safe --sized-types #-} open import Generic.Syntax module Generic.Syntax.PHOAS {I : Set} (d : Desc I) (V : I → Set) where open import Size open import Data.List.Base as L hiding ([_]) open import Function open import Data.Var hiding (_<$>_) open import Data.Environment open import Generic.Semantics private variable Γ : List I LAMBS : (I → Set) → List I → I ─Scoped LAMBS T [] j Γ = T j LAMBS T Δ j Γ = (Δ ─Env) (const ∘′ V) (Δ ++ Γ) → T j data PHOAS (d : Desc I) : Size → I → Set where V[_] : ∀ {s σ} → V σ → PHOAS d (↑ s) σ T[_] : ∀ {s σ} → ⟦ d ⟧ (LAMBS (PHOAS d s)) σ [] → PHOAS d (↑ s) σ binders : ∀ Δ σ → Kripke (const ∘′ V) (const ∘′ PHOAS d ∞) Δ σ Γ → LAMBS (PHOAS d ∞) Δ σ [] binders [] i kr = kr binders Δ@(_ ∷ _) i kr = λ vs → kr identity (id <$> vs) toPHOAS : Semantics d (const ∘′ V) (const ∘′ PHOAS d ∞) Semantics.th^𝓥 toPHOAS = λ v _ → v Semantics.var toPHOAS = V[_] Semantics.alg toPHOAS = T[_] ∘′ fmap d binders