{-# OPTIONS --sized-types #-} module Generic.Semantics.NbyE where open import Size open import Data.Unit open import Data.Bool open import Data.Product open import Data.List.Base hiding ([_]) open import Function open import Relation.Unary open import Relation.Binary.PropositionalEquality hiding ([_]) open import Data.Var using (Var; _─Scoped) open import Data.Var.Varlike open import Data.Environment hiding (_<$>_; sequenceA) open import Generic.Syntax open import Generic.Semantics private variable I : Set s : Size σ : I d : Desc I {-# NO_POSITIVITY_CHECK #-} data Dm (d : Desc I) : Size → I ─Scoped where V : ∀[ Var σ ⇒ Dm d s σ ] C : ∀[ ⟦ d ⟧ (Kripke (Dm d s) (Dm d s)) σ ⇒ Dm d (↑ s) σ ] ⊥ : ∀[ Dm d (↑ s) σ ] module _ {d : Desc I} where th^Dm : Thinnable (Dm d s σ) th^Dm (V k) ρ = V (th^Var k ρ) th^Dm (C t) ρ = C (fmap d (λ Θ i kr → th^Kr Θ th^Dm kr ρ) t) th^Dm ⊥ ρ = ⊥ vl^Dm : VarLike (Dm d s) vl^Dm = record { new = V Var.z ; th^𝓥 = th^Dm } open import Data.Maybe.Base import Data.Maybe.Categorical as Maybe import Category.Monad as CM open import Level private module M = CM.RawMonad (Maybe.monad {zero}) instance _ = M.rawIApplicative open M Alg : (d : Desc I) (𝓥 𝓒 : I ─Scoped) → Set Alg d 𝓥 𝓒 = ∀ {σ Γ} → ⟦ d ⟧ (Kripke 𝓥 𝓒) σ Γ → 𝓒 σ Γ module _ {I : Set} {d : Desc I} where reify^Dm : ∀[ Dm d s σ ⇒ Maybe ∘ Tm d ∞ σ ] nbe : Alg d (Dm d ∞) (Dm d ∞) → Semantics d (Dm d ∞) (Dm d ∞) norm : Alg d (Dm d ∞) (Dm d ∞) → ∀[ Tm d ∞ σ ⇒ Maybe ∘ Tm d ∞ σ ] norm alg = reify^Dm ∘ Semantics.semantics (nbe alg) (base vl^Dm) reify^Dm (V k) = just (`var k) reify^Dm (C v) = `con <$> mapA d (λ Θ i → reify^Dm ∘ reify vl^Dm Θ i) v reify^Dm ⊥ = nothing Semantics.th^𝓥 (nbe alg) = th^Dm Semantics.var (nbe alg) = id Semantics.alg (nbe alg) = alg