Last active
June 18, 2021 13:37
-
-
Save nachivpn/b211d476c38285f90b44ad7e524c9fc9 to your computer and use it in GitHub Desktop.
Beta-WHNF NbE for STLC
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module STLCBetaWHNF where | |
open import Data.Sum | |
open import Data.Unit using (β€ ; tt) | |
open import Data.Product | |
-------------------- | |
-- Term syntax, etc. | |
-------------------- | |
data Ty : Set where | |
π : Ty | |
_β_ : Ty β Ty β Ty | |
data Ctx : Set where | |
[] : Ctx | |
_`,_ : Ctx β Ty β Ctx | |
variable | |
Ξ Ξ Ξ' Ξ' : Ctx | |
a b : Ty | |
data _β€_ : Ctx β Ctx β Set where | |
base : [] β€ [] | |
drop : Ξ β€ Ξ β (Ξ `, a) β€ Ξ | |
keep : Ξ β€ Ξ β (Ξ `, a) β€ (Ξ `, a) | |
idWk : Ξ β€ Ξ | |
idWk {[]} = base | |
idWk {Ξ `, x} = keep idWk | |
_β_ : {Ξ£ : Ctx} β Ξ β€ Ξ£ β Ξ β€ Ξ β Ξ β€ Ξ£ | |
w β base = w | |
w β drop w' = drop (w β w') | |
drop w β keep w' = drop (w β w') | |
keep w β keep w' = keep (w β w') | |
data Var : Ctx β Ty β Set where | |
ze : Var (Ξ `, a) a | |
su : (v : Var Ξ a) β Var (Ξ `, b) a | |
wkVar : Ξ' β€ Ξ β Var Ξ a β Var Ξ' a | |
wkVar (drop w) ze = su (wkVar w ze) | |
wkVar (keep w) ze = ze | |
wkVar (drop w) (su v) = su (wkVar w (su v)) | |
wkVar (keep w) (su v) = su (wkVar w v) | |
data Tm : Ctx β Ty β Set where | |
var : Var Ξ a | |
--------- | |
β Tm Ξ a | |
lam : Tm (Ξ `, a) b | |
------------- | |
β Tm Ξ (a β b) | |
app : Tm Ξ (a β b) β Tm Ξ a | |
--------------------- | |
β Tm Ξ b | |
wkTm : Ξ' β€ Ξ β Tm Ξ a β Tm Ξ' a | |
wkTm w (var x) = var (wkVar w x) | |
wkTm w (lam t) = lam (wkTm (keep w) t) | |
wkTm w (app t u) = app (wkTm w t) (wkTm w u) | |
data Sub : Ctx β Ctx β Set where | |
[] : Sub Ξ [] | |
_`,_ : Sub Ξ Ξ β Tm Ξ a β Sub Ξ (Ξ `, a) | |
wkSub : Ξ' β€ Ξ β Sub Ξ Ξ β Sub Ξ' Ξ | |
wkSub w [] = [] | |
wkSub w (s `, t) = (wkSub w s) `, wkTm w t | |
substVar : Sub Ξ Ξ β Var Ξ a β Tm Ξ a | |
substVar (s `, t) ze = t | |
substVar (s `, t) (su x) = substVar s x | |
substTm : Sub Ξ Ξ β Tm Ξ a β Tm Ξ a | |
substTm s (var x) = substVar s x | |
substTm s (lam t) = lam (substTm (wkSub (drop idWk) s `, var ze) t) | |
substTm s (app t u) = app (substTm s t) (substTm s u) | |
--------------- | |
-- Normal forms | |
--------------- | |
data Ne : Ctx β Ty β Set | |
data Nf : Ctx β Ty β Set | |
data Ne where | |
var : Var Ξ a β Ne Ξ a | |
app : Ne Ξ (a β b) β Nf Ξ a β Ne Ξ b | |
-- Ξ²-WHNFs (i.e., no Ξ· for _β_ and no congruence for lam) | |
data Nf where | |
up : Ne Ξ a β Nf Ξ a | |
lam : Tm (Ξ `, a) b β Nf Ξ (a β b) | |
wkNe : Ξ' β€ Ξ β Ne Ξ a β Ne Ξ' a | |
wkNf : Ξ' β€ Ξ β Nf Ξ a β Nf Ξ' a | |
wkNe w (var x) = var (wkVar w x) | |
wkNe w (app m n) = app (wkNe w m) (wkNf w n) | |
wkNf w (up x) = up (wkNe w x) | |
wkNf w (lam n) = lam (wkTm (keep w) n) | |
embNe : Ne Ξ a β Tm Ξ a | |
embNf : Nf Ξ a β Tm Ξ a | |
embNe (var x) = var x | |
embNe (app m n) = app (embNe m) (embNf n) | |
embNf (up x) = embNe x | |
embNf (lam t) = lam t | |
------------------------------ | |
-- Normalisation by Evaluation | |
------------------------------ | |
-- interpretation of types (β¦_β§) | |
Tm' : Ctx β Ty β Set | |
Tm' Ξ π = Nf Ξ π | |
Tm' Ξ (a β b) = (Tm' Ξ a β Tm' Ξ b) Γ Nf Ξ (a β b) | |
-- note: `Ξ' β€ Ξ β Tm' Ξ a β Tm' Ξ' a` is not admissible, fails for _β_ type | |
-- semantics supports reification | |
reify : Tm' Ξ a β Nf Ξ a | |
reify {a = π} n = n | |
reify {a = a β b} x = projβ x | |
-- semantic domain supports reflection | |
reflect : Ne Ξ a β Tm' Ξ a | |
reflect {a = π} n = up n | |
reflect {a = a β b} n = (Ξ» x β reflect (app n (reify x))) , up n | |
-- retraction of eval | |
quot : Tm' Ξ a β Tm Ξ a | |
quot x = embNf (reify x) | |
-- interpretation of contexts | |
Sub' : Ctx β Ctx β Set | |
Sub' Ξ [] = β€ | |
Sub' Ξ (Ξ `, a) = Sub' Ξ Ξ Γ Tm' Ξ a | |
-- interpretation of variables | |
substVar' : Var Ξ a β ({Ξ : Ctx} β Sub' Ξ Ξ β Tm' Ξ a) | |
substVar' ze (_ , x) = x | |
substVar' (su x) (Ξ³ , _) = substVar' x Ξ³ | |
-- retraction of evalβ | |
quotβ : Sub' Ξ Ξ β Sub Ξ Ξ | |
quotβ {Ξ = []} tt = [] | |
quotβ {Ξ = Ξ `, _} (s , x) = (quotβ s) `, quot x | |
-- interpretation of terms | |
eval : Tm Ξ a β ({Ξ : Ctx} β Sub' Ξ Ξ β Tm' Ξ a) | |
eval (var x) s = substVar' x s | |
eval (lam t) s = (Ξ» x β eval t (s , x)) | |
, (lam (substTm (wkSub (drop idWk) (quotβ s) `, (var ze)) t)) | |
eval (app t u) s = projβ (eval t s) (eval u s) | |
-- variable substitution | |
data VSub : Ctx β Ctx β Set where | |
[] : VSub Ξ [] | |
_`,_ : VSub Ξ Ξ β Var Ξ a β VSub Ξ (Ξ `, a) | |
-- weaken variable substitutions | |
wkVSub : Ξ' β€ Ξ β VSub Ξ Ξ β VSub Ξ' Ξ | |
wkVSub w [] = [] | |
wkVSub w (ns `, x) = wkVSub w ns `, wkVar w x | |
-- identity variable substitution | |
idVSub : VSub Ξ Ξ | |
idVSub {[]} = [] | |
idVSub {Ξ `, x} = wkVSub (drop idWk) idVSub `, ze | |
-- reflect a variable substitution | |
reflectVSub : VSub Ξ Ξ β Sub' Ξ Ξ | |
reflectVSub [] = tt | |
reflectVSub (ns `, n) = reflectVSub ns , reflect (var n) | |
-- identity semantic substitution | |
idβ' : Sub' Ξ Ξ | |
idβ' = reflectVSub idVSub | |
-- normalisation function | |
norm : Tm Ξ a β Nf Ξ a | |
norm t = reify (eval t idβ') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment