{-# OPTIONS --safe --sized-types #-} module Generic.Semantics.Elaboration.Typed where import Level open import Size open import Function import Category.Monad as CM open import Data.Bool open import Data.Product as Prod open import Data.List hiding ([_] ; lookup) open import Data.List.Relation.Unary.All as All hiding (lookup) open import Data.Maybe as Maybe using (Maybe; nothing; just) open import Category.Monad import Data.Maybe.Categorical as MC open RawMonad (MC.monad {Level.zero}) open import Generic.Syntax.Bidirectional open import Generic.Syntax.STLC as S open import Relation.Unary hiding (_∈_) open import Data.Var hiding (_<$>_) open import Data.Environment hiding (_<$>_) open import Generic.Syntax open import Generic.Semantics open import Relation.Binary.PropositionalEquality hiding ([_]) Typing : List Mode → Set Typing = All (const Type) private variable σ : Type m : Mode ms ns : List Mode ⌞_⌟ : Typing ms → List Type ⌞ [] ⌟ = [] ⌞ σ ∷ Γ ⌟ = σ ∷ ⌞ Γ ⌟ Elab : Type ─Scoped → Type → (ms : List Mode) → Typing ms → Set Elab T σ _ Γ = T σ ⌞ Γ ⌟ Elab- : Mode ─Scoped Elab- Check ms = ∀ Γ → (σ : Type) → Maybe (Elab (Tm STLC ∞) σ ms Γ) Elab- Infer ms = ∀ Γ → Maybe (Σ[ σ ∈ Type ] Elab (Tm STLC ∞) σ ms Γ) data Var- : Mode ─Scoped where `var : (infer : ∀ Γ → Σ[ σ ∈ Type ] Elab Var σ ms Γ) → Var- Infer ms open import Data.List.Relation.Unary.Any hiding (lookup) open import Data.List.Membership.Propositional toVar : m ∈ ms → Var m ms toVar (here refl) = z toVar (there v) = s (toVar v) fromVar : Var m ms → m ∈ ms fromVar z = here refl fromVar (s v) = there (fromVar v) coth^Typing : Typing ns → Thinning ms ns → Typing ms coth^Typing Δ ρ = All.tabulate (λ x∈Γ → All.lookup Δ (fromVar (lookup ρ (toVar x∈Γ)))) lookup-fromVar : ∀ Δ (v : Var m ms) → Var (All.lookup Δ (fromVar v)) ⌞ Δ ⌟ lookup-fromVar (_ ∷ _) z = z lookup-fromVar (_ ∷ _) (s v) = s (lookup-fromVar _ v) erase^coth : ∀ ms Δ (ρ : Thinning ms ns) → Var σ ⌞ coth^Typing Δ ρ ⌟ → Var σ ⌞ Δ ⌟ erase^coth [] Δ ρ () erase^coth (m ∷ ms) Δ ρ z = lookup-fromVar Δ (lookup ρ z) erase^coth (m ∷ ms) Δ ρ (s v) = erase^coth ms Δ (select weaken ρ) v th^Var- : Thinnable (Var- m) th^Var- (`var infer) ρ = `var λ Δ → let (σ , v) = infer (coth^Typing Δ ρ) in σ , erase^coth _ Δ ρ v open Semantics _=?_ : (σ τ : Type) → Maybe (σ ≡ τ) α =? α = just refl (σ `→ τ) =? (φ `→ ψ) = do refl ← σ =? φ refl ← τ =? ψ return refl _ =? _ = nothing data Arrow : Type → Set where _`→_ : ∀ σ τ → Arrow (σ `→ τ) isArrow : ∀ σ → Maybe (Arrow σ) isArrow (σ `→ τ) = just (σ `→ τ) isArrow _ = nothing app : ∀[ Elab- Infer ⇒ Elab- Check ⇒ Elab- Infer ] app f t Γ = do (arr , F) ← f Γ (σ `→ τ) ← isArrow arr T ← t Γ σ return (τ , `app F T) var₀ : Var- Infer (Infer ∷ ms) var₀ = `var λ where (σ ∷ _) → (σ , z) lam : ∀[ Kripke Var- Elab- (Infer ∷ []) Check ⇒ Elab- Check ] lam b Γ arr = do (σ `→ τ) ← isArrow arr B ← b (bind Infer) (ε ∙ var₀) (σ ∷ Γ) τ return (`lam B) emb : ∀[ Elab- Infer ⇒ Elab- Check ] emb t Γ σ = do (τ , T) ← t Γ refl ← σ =? τ return T cut : Type → ∀[ Elab- Check ⇒ Elab- Infer ] cut σ t Γ = (σ ,_) <$> t Γ σ Elaborate : Semantics Bidi Var- Elab- Elaborate .th^𝓥 = th^Var- Elaborate .var = λ where (`var infer) Γ → just (map₂ `var (infer Γ)) Elaborate .alg = λ where (`app' f t) → app f t (`lam' b) → lam b (`emb' t) → emb t (`cut' σ t) → cut σ t where open PATTERNS Type- : Mode → Set Type- Check = ∀ σ → Maybe (TM STLC σ) Type- Infer = Maybe (∃ λ σ → TM STLC σ) type- : ∀ p → TM Bidi p → Type- p type- Check t = closed Elaborate t [] type- Infer t = closed Elaborate t [] module B = PATTERNS module _ where private β : Type β = α `→ α _ : type- Infer ( B.`app (B.`cut (β `→ β) id^B) id^B) ≡ just (β , S.`app id^S id^S) _ = refl