changeset 71:b0cfef1cd89f

Add sample source
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Mon, 06 Feb 2017 10:15:16 +0900
parents 4b8a75618f36
children fd984cfd5425
files paper/atton-master.pdf paper/atton-master.tex paper/cbc-type.tex paper/sources.tex paper/src/atton-master-meta-sample.agda paper/src/atton-master-sample.agda
diffstat 6 files changed, 136 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
Binary file paper/atton-master.pdf has changed
--- a/paper/atton-master.tex	Sun Feb 05 16:53:16 2017 +0900
+++ b/paper/atton-master.tex	Mon Feb 06 10:15:16 2017 +0900
@@ -138,5 +138,6 @@
 
 %付録
 \addcontentsline{toc}{chapter}{付録}
-% \input{appendix.tex}
+\appendix
+\input{sources.tex}
 \end{document}
--- a/paper/cbc-type.tex	Sun Feb 05 16:53:16 2017 +0900
+++ b/paper/cbc-type.tex	Mon Feb 06 10:15:16 2017 +0900
@@ -57,6 +57,7 @@
 
 % {{{ ノーマルレベル計算の実行
 \section{ノーマルレベル計算の実行}
+\label{section:normal-level-exec}
 プログラムを実行することは \verb/goto/ を定義することと同義である。
 軽量継続\verb/goto/ の性質としては
 
@@ -78,7 +79,7 @@
 
 この \verb/goto/ の定義を用いることで main などの関数が評価できるようになり、値150が得られる。
 本文中での CodeSegment の定義は一部を抜粋している。
-実行可能な Agda のソースコードは付録に載せる。% TODO: Appendix
+実行可能な Agda のソースコードは付録に載せる。
 
 % }}}
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/sources.tex	Mon Feb 06 10:15:16 2017 +0900
@@ -0,0 +1,9 @@
+\chapter{chapter:sources}
+本論文中に取り上げた Agda の動作するソースコードを示す。
+
+\section{ノーマルレベル動作の実行}
+\label{appendix:normal-level-exec}
+\ref{section:normal-level-exec}節で取り上げたソースコードをリスト~\ref{src:normal-level-exec}に示す。
+CbC のコードにより近づけるようにA gda 上の \verb/Data.Nat/ を \verb/Int/ という名前に変更している。
+
+\lstinputlisting[label=src:normal-level-exec, caption=ノーマルレベル実行の完全なソースコード] {src/atton-master-sample.agda}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/atton-master-meta-sample.agda	Mon Feb 06 10:15:16 2017 +0900
@@ -0,0 +1,77 @@
+module atton-master-meta-sample where
+
+open import Data.Nat
+open import Data.Unit
+open import Function
+Int = ℕ
+
+record Context : Set where
+  field
+    a  : Int
+    b  : Int
+    c  : Int
+
+open import subtype Context as N
+
+record Meta : Set where 
+  field
+    context : Context
+    c'      : Int
+    next    : N.CodeSegment Context Context
+
+open import subtype Meta as M
+
+instance
+  _ : N.DataSegment Context
+  _ = record { get = id ; set = (\_ c -> c) }
+  _ : M.DataSegment Context
+  _ = record { get = (\m -> Meta.context m)  ;
+               set = (\m c -> record m {context = c}) }
+  _ : M.DataSegment Meta
+  _ = record { get = id ; set = (\_ m -> m) }
+
+
+liftContext : {X Y : Set} {{_ : N.DataSegment X}} {{_ : N.DataSegment Y}} -> N.CodeSegment X Y -> N.CodeSegment Context Context
+liftContext {{x}} {{y}} (N.cs f) = N.cs (\c -> N.DataSegment.set y c (f (N.DataSegment.get x c)))
+
+liftMeta : {X Y : Set} {{_ : M.DataSegment X}} {{_ : M.DataSegment Y}} -> N.CodeSegment X Y -> M.CodeSegment X Y
+liftMeta (N.cs f) = M.cs f
+
+
+gotoMeta : {I O : Set} {{_ : N.DataSegment I}} {{_ : N.DataSegment O}} -> M.CodeSegment Meta Meta -> N.CodeSegment I O -> Meta -> Meta
+gotoMeta mCode code m = M.exec mCode (record m {next = (liftContext code)})
+
+push : M.CodeSegment Meta Meta
+push = M.cs (\m -> M.exec (liftMeta (Meta.next m)) (record m {c' = Context.c (Meta.context m)}))
+
+
+record ds0 : Set where
+  field
+    a : Int
+    b : Int
+
+record ds1 : Set where
+  field
+    c : Int
+
+instance
+  _ : N.DataSegment ds0
+  _ = record { set = (\c d -> record c {a = (ds0.a d) ; b = (ds0.b d)})
+             ; get = (\c ->   record { a = (Context.a c) ; b = (Context.b c)})}
+  _ : N.DataSegment ds1
+  _ = record { set = (\c d -> record c {c = (ds1.c d)})
+             ; get = (\c ->   record { c = (Context.c c)})}
+
+cs2 : N.CodeSegment ds1 ds1
+cs2 = N.cs id
+
+cs1 : N.CodeSegment ds1 ds1
+cs1 = N.cs (\d -> N.goto cs2 d)
+
+cs0 : N.CodeSegment ds0 ds1
+cs0 = N.cs (\d -> N.goto cs1 (record {c = (ds0.a d) + (ds0.b d)}))
+
+
+main : Meta
+main = gotoMeta push cs0 (record {context = (record {a = 100 ; b = 50 ; c = 70}) ; c' = 0 ; next = (N.cs id)})
+-- record {context = record {a = 100 ; b = 50 ; c = 150} ; c' = 70 ; next = (N.cs id)}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/paper/src/atton-master-sample.agda	Mon Feb 06 10:15:16 2017 +0900
@@ -0,0 +1,46 @@
+module atton-master-sample where
+
+open import Data.Nat
+open import Data.Unit
+open import Function
+Int = ℕ
+
+record Context : Set where
+  field
+    a : Int
+    b : Int
+    c : Int
+
+
+open import subtype Context
+
+
+
+record ds0 : Set where
+  field
+    a : Int
+    b : Int
+
+record ds1 : Set where
+  field
+    c : Int
+
+instance
+  _ : DataSegment ds0
+  _ = record { set = (\c d -> record c {a = (ds0.a d) ; b = (ds0.b d)})
+             ; get = (\c ->   record { a = (Context.a c) ; b = (Context.b c)})}
+  _ : DataSegment ds1
+  _ = record { set = (\c d -> record c {c = (ds1.c d)})
+             ; get = (\c ->   record { c = (Context.c c)})}
+
+cs2 : CodeSegment ds1 ds1
+cs2 = cs id
+
+cs1 : CodeSegment ds1 ds1
+cs1 = cs (\d -> goto cs2 d)
+
+cs0 : CodeSegment ds0 ds1
+cs0 = cs (\d -> goto cs1 (record {c = (ds0.a d) + (ds0.b d)}))
+
+main : ds1
+main = goto cs0 (record {a = 100 ; b = 50})