annotate paper/cbc-type.tex @ 58:68bf744d726e

Writing cs/ds in agda
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Wed, 01 Feb 2017 14:52:01 +0900
parents 3f58377a9f59
children 5450e7ae5fa5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
57
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \chapter{Agda における Continuation based C の表現}
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 \label{chapter:cbc-type}
58
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
3 CbC の項を部分型を用いて Agda 上に記述していく。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
4 DataSegment と CodeSegment の定義、CodeSegment の接続と実行、メタ計算を定義し、 Agda 上で実行できることを確認する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
5 また、Agda上で定義した DataSegment とそれに付随する CodeSegment の持つ性質を Agda 上で証明していく。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
6
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
7 \section{DataSegment の定義}
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
8 まず DataSegment から定義していく。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
9 DataSegment はレコード型で表現できるため、Agda のレコードをそのまま利用できる。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
10 例えは~\ref{src:goto} に示していた a と b を加算して c を出力するプログラムに必要な DataSegment を記述すると~\ref{src:agda-ds}のようになる。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
11 cs0 は a と b の二つの Int 型の変数を利用するため、対応する ds0 は a と b のフィールドを持つ。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
12 cs1 は計算結果を格納する c という名前の変数のみを持つので、同様にds1もcのみを持つ。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
13
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
14 \lstinputlisting[label=src:agda-ds, caption=Agda における DataSegment の定義] {src/DataSegment.agda}
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
15
57
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 \section{CodeSegment の定義}
58
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
17 次に CodeSegment を定義する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
18 CodeSegment は DataSegment を取って DataSegment を返すものである。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
19 よって $ I \rightarrow O $ を内包するデータ型を定義する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
20
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
21 レコード型の型は Set なので、Set 型を持つ変数 I と O を型変数に持ったデータ型 CodeSegment を定義する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
22 I は Input DataSegment の型であり、 O は Output DataSegment である。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
23
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
24 CodeSegment 型のコンストラクタには \verb/cs/ があり、Input DataSegment を取って Output DataSegment を返す関数を取る。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
25 具体的なデータ型の定義はリスト ~\ref{src:agda-cs} のようになる。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
26
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
27 \lstinputlisting[label=src:agda-cs, caption= Agda における CodeSegment 型の定義] {src/CodeSegment.agda}
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
28
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
29 この CodeSegment 型を用いて CodeSegment の処理本体を記述する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
30
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
31 まず計算の本体となる cs0 に注目する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
32 cs0 は二つのInt型変数を持つ ds0 を取り、一つのInt型変数を作った上で cs1 に軽量継続を行なう。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
33 DataSegment はレコードなので、a と b のフィールドから値を取り出した上で加算を行ない、cを持つレコードを生成する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
34 そのレコードを引き連れたまま cs1 へと goto する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
35
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
36 次に cs1 に注目する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
37 cs1 は値に触れず cs2 へと goto するだけである。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
38 よって何もせずにそのまま goto する関数をコンストラクタ\verb/cs/ に渡すだけで良い。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
39
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
40 最後に cs2 である。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
41 cs2 はリスト~\ref{src:goto}では省略していたが、今回は計算を終了させる CodeSegment として定義する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
42 どの CodeSegment にも軽量継続せずに値を持ったまま計算を終了させる。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
43 コンストラクタ \verb/cs/ には関数を与えなくては値を構成できないため、何もしない関数である id を渡している。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
44
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
45 最後に計算をする cs0 へと軽量継続する main を定義する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
46 例として、 a の値を 100 とし、 b の値を50としている。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
47 正しく計算が行なえたら値150が得られるはずである。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
48
57
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 \section{ノーマルレベル計算の実行}
58
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
50 \section{MetaDataSegment の定義}
57
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 \section{MetaCodeSegment の定義}
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 \section{メタレベル計算の実行}
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 \section{Agda を用いたContinuation based C の検証}
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 \section{スタックの実装の検証}