cek-call-cc/src/Project/Definitions.agda

118 lines
2.9 KiB
Agda
Raw Normal View History

2021-12-08 00:33:28 -06:00
module Project.Definitions where
open import Data.Maybe using (Maybe; just; nothing)
open import Data.Nat using (; zero; suc)
open import Data.Product renaming (_,_ to _ʻ_)
open import Project.Util using (_$_)
infix 4 _∋_
infix 4 _·_
infixl 6 _,_
infixr 7 _⇒_
data Type : Set where
2021-12-09 02:05:20 -06:00
: Type
2021-12-08 00:33:28 -06:00
` : Type
2021-12-09 04:32:32 -06:00
_⇒_ : Type Type Type
2021-12-08 00:33:28 -06:00
data Context : Set where
: Context
_,_ : Context Type Context
data Value : Type Set
data Env : Context Set where
: Env
_[__] : {Γ} Env Γ (A : Type) Value A Env (Γ , A)
data _∋_ : Context Type Set where
zero : {Γ A} Γ , A A
suc : {Γ A B} Γ A Γ , B A
lookup : {Γ A} Env Γ Γ A Value A
lookup ()
lookup (env [ A x ]) zero = x
lookup (env [ A x ]) (suc id) = lookup env id
data Aexp Context : Type Set
data Exp Context : Type Set
data Aexp Γ where
2021-12-09 02:05:20 -06:00
value : {A} Value A Aexp Γ A
2021-12-08 00:33:28 -06:00
-- Natural numbers
zero : Aexp Γ `
suc : Aexp Γ ` Aexp Γ `
-- Functions
`_ : {A} Γ A Aexp Γ A
ƛ : {B} {A : Type} Exp (Γ , A) B Aexp Γ (A B)
data Exp Γ where
2021-12-09 04:32:32 -06:00
abort : {A} Aexp Γ Exp Γ A
2021-12-08 00:33:28 -06:00
-- Atomic expressions
atomic : {A} Aexp Γ A Exp Γ A
-- Natural numbers
case : {A} Aexp Γ ` Exp Γ A Aexp Γ (` A) Exp Γ A
-- Functions
_·_ : {A B} Aexp Γ (A B) Aexp Γ A Exp Γ B
-- Call/cc
2021-12-09 04:32:32 -06:00
call/cc : {A } Aexp (Γ) ((A ) ) Exp Γ
-- Let
`let : {A B : Type} Exp Γ A Exp (Γ , A) B Exp Γ B
-- exp = let (call/cc ƛ . let (abort `0) (`0 · 2)) ((\ . suc `0) · `0)
-- exp = let (s = call/cc ƛk . let (k' = abort k) (k' · 2)) (suc s)
-- exp = 3
exp : Exp `
exp =
`let (call/cc (
-- `let (` zero · suc (suc zero)) (abort (` zero))
ƛ (` zero · suc (suc zero))
)) (`let (abort (` zero)) ((ƛ (atomic (suc (` suc zero)))) · ` zero))
2021-12-08 00:33:28 -06:00
data Kont ( : Type) : Type Set
2021-12-09 02:05:20 -06:00
record Letk (Tv : Type) : Set
2021-12-08 00:33:28 -06:00
data Value where
-- Natural numbers
zero : Value `
suc : Value ` Value `
-- Functions
clo : {Γ} {A B : Type} Exp (Γ , A) B Env Γ Value (A B)
-- Call/CC
2021-12-09 04:32:32 -06:00
-- cont : ∀ {Tω A} → Kont Tω A → Value (A ⇒ ⊥)
cont : { A B} Kont A Value (B )
2021-12-08 00:33:28 -06:00
2021-12-09 02:05:20 -06:00
record Letk Tv where
2021-12-08 00:33:28 -06:00
inductive
constructor letk
field
{Tc} : Type
Γ : Context
C : Exp (Γ , Tv) Tc
E : Env Γ
K : Kont Tc
data Kont where
halt : Kont
2021-12-09 02:05:20 -06:00
kont : {Tc} Letk Tc Kont Tc
2021-12-08 00:33:28 -06:00
-- A is the type of C
-- B is the eventual type
record State ( : Type) : Set where
constructor mkState
field
Tc : Type
Γ : Context
C : Exp Γ Tc
E : Env Γ
K : Kont Tc