From fcd1561f7b5cbcfc6ce27ed2b12f156eeea416af Mon Sep 17 00:00:00 2001 From: Michael Zhang Date: Wed, 8 Dec 2021 00:33:28 -0600 Subject: [PATCH] Move source code here. --- .gitignore | 5 ++ Justfile | 2 - Makefile | 16 ++++++ cesk.png | Bin 0 -> 44062 bytes csci8980-project.agda-lib | 3 ++ main.tex | 62 +++++++++++++++++---- res.bib | 21 ++++++++ src/Project/Cesk.agda | 40 ++++++++++++++ src/Project/Definitions.agda | 101 +++++++++++++++++++++++++++++++++++ src/Project/Do.agda | 21 ++++++++ src/Project/Util.agda | 6 +++ 11 files changed, 265 insertions(+), 12 deletions(-) delete mode 100644 Justfile create mode 100644 Makefile create mode 100644 cesk.png create mode 100644 csci8980-project.agda-lib create mode 100644 res.bib create mode 100644 src/Project/Cesk.agda create mode 100644 src/Project/Definitions.agda create mode 100644 src/Project/Do.agda create mode 100644 src/Project/Util.agda diff --git a/.gitignore b/.gitignore index a136337..9674ea3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ +*.agdai +*.blg *.pdf +/gentex +/agda.sty +/main.log diff --git a/Justfile b/Justfile deleted file mode 100644 index f69f868..0000000 --- a/Justfile +++ /dev/null @@ -1,2 +0,0 @@ -watch: - watchexec -e tex -- tectonic main.tex diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..104a5e1 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +SOURCE_MODULES := $(shell find src/Project -name "*.agda" -exec basename {} \;) +GENERATED_TEX := $(patsubst %.agda, gentex/Project/%.tex, $(SOURCE_MODULES)) + +gentex/Project/%.tex: src/Project/%.agda + agda --latex-dir=gentex --latex $< + +agda.sty: $(GENERATED_TEX) + cp gentex/agda.sty agda.sty + +main.pdf: main.tex agda.sty + tectonic --keep-logs main.tex + +watch: + watchexec -e tex -- make main.pdf + +.PHONY: watch diff --git a/cesk.png b/cesk.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ebebed840425115609e3f7ed94a69182666053 GIT binary patch literal 44062 zcmV)aK&roqP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 G!u}7BUQyWq literal 0 HcmV?d00001 diff --git a/csci8980-project.agda-lib b/csci8980-project.agda-lib new file mode 100644 index 0000000..e7d169e --- /dev/null +++ b/csci8980-project.agda-lib @@ -0,0 +1,3 @@ +name: csci8980-project +depend: standard-library +include: ./src diff --git a/main.tex b/main.tex index 891586d..8f54446 100644 --- a/main.tex +++ b/main.tex @@ -1,22 +1,49 @@ \documentclass{beamer} - \usepackage[utf8]{inputenc} +\usepackage{agda} +\usepackage{caption} +\usepackage{catchfilebetweentags} +\usepackage{cite} +\usepackage{newunicodechar} +\usepackage{url} + +\usetheme{CambridgeUS} +\usecolortheme{lily} +\setbeamercovered{transparent} + \usepackage{tikz} \usetikzlibrary{positioning} -%Information to be included in the title page: -\title{Sample title} -\author{Anonymous} -\institute{Overleaf} -\date{2021} +\titlegraphic{ + \centering + \includegraphics[width=.3\textwidth,height=.5\textheight]{cesk.png} +} +\title{First class continuations with CEK machines in Agda} +\author{Michael Zhang} +\date{} \begin{document} \frame{\titlepage} +\section{Primer on CESK} + \begin{frame} -\frametitle{Sample frame title} -This is some text in the first frame. This is some text in the first frame. This is some text in the first frame. + \frametitle{What is a CESK machine?} + + \begin{itemize}[<+->] + \item Abstract machine for interpreters, introduced by Matthias Felleisen. + \item Stands for $C$ontrol, $E$nvironment, $S$tore, $K$ontinuation. + \item Based on Matt Might's blog post on CESK machines \cite{might-cesk}. + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{How does it work?} + + \begin{itemize}[<+->] + \item + \end{itemize} \end{frame} \begin{frame} @@ -27,16 +54,31 @@ This is some text in the first frame. This is some text in the first frame. This \node[draw, align=left, squarednode](ceskState){ C = $\lambda x . (\lambda y . x + y)$ \\ $E$ = [] \\ - $S$ = [] \\ $\kappa$ = halt }; - \node[squarednode](ceskState2)[right=of ceskState]{CESK}; + \node[squarednode](ceskState2)[right=of ceskState]{CEK}; %lines \draw[->] (ceskState.east) -- (ceskState2.west); \end{tikzpicture} \end{frame} +\section{Implementation} + +\begin{frame} + \frametitle{Hellosu} + + \include{./gentex/Project/Cesk.tex} +\end{frame} + +\section{Conclusion} + +\begin{frame} + \frametitle{Resources} + \bibliography{res}{} + \bibliographystyle{plain} +\end{frame} + \end{document} % vim: set sw=2 : diff --git a/res.bib b/res.bib new file mode 100644 index 0000000..051a316 --- /dev/null +++ b/res.bib @@ -0,0 +1,21 @@ +@phdthesis{ + felleisen-cesk, + author = "Matthias Felleisen", + howpublished = {\url{https://www2.ccs.neu.edu/racket/pubs/dissertation-felleisen.pdf}}, +} + +@misc{ + might-cesk, + author = "Matt Might", + title = "Writing an interpreter, CESK-style", + howpublished = {\url{https://matt.might.net/articles/cesk-machines}}, +} + +@misc{ + source-code, + author = "Michael Zhang", + title = "First class continuations with CEK machines in Agda", + howpublished = {\url{https://git.sr.ht/~mzhang/csci8980-f21-project}}, +} + +@comment vim: set sw=2 : diff --git a/src/Project/Cesk.agda b/src/Project/Cesk.agda new file mode 100644 index 0000000..639e313 --- /dev/null +++ b/src/Project/Cesk.agda @@ -0,0 +1,40 @@ +{-# OPTIONS --allow-incomplete-matches --allow-unsolved-metas #-} + +module Project.Cesk where + +open import Data.Product renaming (_,_ to ⦅_,_⦆) +open import Project.Definitions using (Aexp; Exp; Env; State; Letk; Kont; Value; Type; atomic; kont; letk; lookup; call/cc; case; mkState; halt; `ℕ; _,_; _k⇒_; _⇒_; _∋_; _·_; _∘_; _[_∶_]; ∅) +open import Project.Util using (_$_) +open import Project.Do using (StepResult; part; done; do-kont; do-apply) + +open Aexp +open Value +open State + +astep : ∀ {Γ A} → Aexp Γ A → Env Γ → Value A +astep zero _ = zero +astep (suc c) e = suc $ astep c e +astep (` id) e = lookup e id +astep (ƛ body) e = clo body e + +inject : (A : Type) → Exp ∅ A → State A +inject A C = mkState A ∅ C ∅ halt + +step : ∀ {Tω : Type} → State Tω → StepResult Tω +step (mkState Tc Γ (case c cz cs) E K) with ⦅ astep c E , astep cs E ⦆ +... | ⦅ zero , _ ⦆ = part $ mkState Tc Γ cz E K +... | ⦅ suc n , clo {Γc} cc cloE ⦆ = + part $ mkState Tc (Γc , `ℕ) cc (cloE [ `ℕ ∶ n ]) K +step (mkState Tc Γ (C₁ · C₂) E K) = + let C₁′ = astep C₁ E in + let C₂′ = astep C₂ E in + do-apply C₁′ C₂′ K +step (mkState Tc Γ (atomic x) E K) with K +... | halt = done $ astep x E +... | kont l = part $ do-kont l $ astep x E +step (mkState Tc Γ (call/cc C) E K) = + part $ mkState ({! !} k⇒ {! !}) Γ {! !} {! !} {! !} + +-- 3 + (call/cc k . k 2 + k 4) +-- (k . k 2 + k 4) (\x . 3 + x) +-- ((\x . 3 + x) 2 + (\x . 3 + x) 4) \ No newline at end of file diff --git a/src/Project/Definitions.agda b/src/Project/Definitions.agda new file mode 100644 index 0000000..9a1cca4 --- /dev/null +++ b/src/Project/Definitions.agda @@ -0,0 +1,101 @@ +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 + _⇒_ : Type → Type → Type + _k⇒_ : Type → Type → Type + `ℕ : Type + +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 + -- Natural numbers + zero : Aexp Γ `ℕ + suc : Aexp Γ `ℕ → Aexp Γ `ℕ + + -- Functions + `_ : ∀ {A} → Γ ∋ A → Aexp Γ A + ƛ : ∀ {B} {A : Type} → Exp (Γ , A) B → Aexp Γ (A ⇒ B) + +data Exp Γ where + -- 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 + _∘_ : ∀ {A B} → Aexp Γ (A k⇒ B) → Exp Γ B + + -- Call/cc + call/cc : ∀ {Tω A B} → Exp Γ (A ⇒ B) → Exp Γ Tω + +data Kont (Tω : Type) : Type → Set + +data Value where + -- Natural numbers + zero : Value `ℕ + suc : Value `ℕ → Value `ℕ + + -- Functions + clo : ∀ {Γ} {A B : Type} → Exp (Γ , A) B → Env Γ → Value (A ⇒ B) + + -- Call/CC + kont : ∀ {Tω Ti Tc} → Kont Tω Tc → Value (Ti k⇒ Tc) + +record Letk (Tv Tω : Type) : Set + +record Letk Tv Tω where + inductive + constructor letk + field + {Tc} : Type + Γ : Context + C : Exp (Γ , Tv) Tc + E : Env Γ + K : Kont Tω Tc + +data Kont Tω where + halt : Kont Tω Tω + kont : ∀ {Tc} → Letk Tc Tω → Kont Tω Tc + +-- A is the type of C +-- B is the eventual type +record State (Tω : Type) : Set where + constructor mkState + field + Tc : Type + Γ : Context + C : Exp Γ Tc + E : Env Γ + K : Kont Tω Tc \ No newline at end of file diff --git a/src/Project/Do.agda b/src/Project/Do.agda new file mode 100644 index 0000000..f0d0ee0 --- /dev/null +++ b/src/Project/Do.agda @@ -0,0 +1,21 @@ +module Project.Do where + +open import Project.Definitions using (Letk; Kont; Exp; Value; State; Type; kont; halt; letk; clo; zero; suc; mkState; `_; `ℕ; _·_; _⇒_; _,_; _[_∶_]) +open import Project.Util using (_$_) + +data StepResult (A : Type) : Set where + part : State A → StepResult A + done : Value A → StepResult A + +-- Apply the continuation to the value, resulting in a state. +do-kont : ∀ {Tv Tω} (L : Letk Tv Tω) → Value Tv → State Tω +do-kont {Tv} {Tω} (letk {Tc} Γ C E k) v = + let Γ′ = Γ , Tv in + let E′ = E [ Tv ∶ v ] in + mkState Tc Γ′ C E′ k + +do-apply : ∀ {A B Tω} → Value (A ⇒ B) → Value A → Kont Tω B → StepResult Tω +do-apply (clo {Γ} {A} {B} body e) v k = + let Γ′ = Γ , A in + let E′ = e [ A ∶ v ] in + part $ mkState B Γ′ body E′ k \ No newline at end of file diff --git a/src/Project/Util.agda b/src/Project/Util.agda new file mode 100644 index 0000000..a2029f4 --- /dev/null +++ b/src/Project/Util.agda @@ -0,0 +1,6 @@ +module Project.Util where + +infixr 0 _$_ + +_$_ : ∀ {a b : Set} → (a → b) → a → b +f $ x = f x \ No newline at end of file