{-# OPTIONS --safe --sized-types #-}
module Generic.Semantics.TypeChecking where
open import Size
open import Function
open import Data.Unit using (⊤; tt)
open import Data.Product
open import Data.List hiding ([_])
open import Data.Maybe using (Maybe; nothing; just)
import Data.Maybe.Categorical as MC
open import Data.Var hiding (_<$>_)
open import Data.Environment hiding (_<$>_ ; _>>_)
open import Generic.Syntax
open import Generic.Syntax.Bidirectional; open PATTERNS
open import Generic.Semantics
import Category.Monad as CM
import Level
module M = CM.RawMonad (MC.monad {Level.zero})
open M
open import Relation.Binary.PropositionalEquality hiding ([_])
infix 2 _=?_
_=?_ : (σ τ : Type) → Maybe ⊤
α =? α = just tt
(σ `→ τ) =? (φ `→ ψ) = (σ =? φ) >> (τ =? ψ)
_ =? _ = nothing
isArrow : Type → Maybe (Type × Type)
isArrow (σ `→ τ) = just (σ , τ)
isArrow _ = nothing
private
variable
i : Mode
Γ : List Mode
Type- : Mode → Set
Type- Check = Type → Maybe ⊤
Type- Infer = Maybe Type
data Var- : Mode → Set where
`var : Type → Var- Infer
app : Type- Infer → Type- Check → Type- Infer
app f t = do
arr ← f
(σ , τ) ← isArrow arr
τ <$ t σ
cut : Type → Type- Check → Type- Infer
cut σ t = σ <$ t σ
emb : Type- Infer → Type- Check
emb t σ = do
τ ← t
σ =? τ
lam : Kripke (const ∘ Var-) (const ∘ Type-) (Infer ∷ []) Check Γ → Type- Check
lam b arr = do
(σ , τ) ← isArrow arr
b (bind Infer) (ε ∙ `var σ) τ
Typecheck : Semantics Bidi (const ∘ Var-) (const ∘ Type-)
Semantics.th^𝓥 Typecheck = th^const
Semantics.var Typecheck = λ where (`var σ) → just σ
Semantics.alg Typecheck = λ where
(`app' f t) → app f t
(`cut' σ t) → cut σ t
(`emb' t) → emb t
(`lam' b) → lam b
type- : ∀ p → TM Bidi p → Type- p
type- p = Semantics.closed Typecheck
module _ where
private β = α `→ α
_ : type- Infer (`app (`cut (β `→ β) id^B) id^B) ≡ just β
_ = refl