annotate paper/cbc-type.tex @ 66:40ae32725e55

Add push/pop description
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Sat, 04 Feb 2017 12:23:25 +0900
parents c0693ad89f04
children ec6799ca9d42
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
59
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
7 % {{{ DataSegment の定義
58
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
8 \section{DataSegment の定義}
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
9 まず DataSegment から定義していく。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
10 DataSegment はレコード型で表現できるため、Agda のレコードをそのまま利用できる。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
11 例えは~\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
12 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
13 cs1 は計算結果を格納する c という名前の変数のみを持つので、同様にds1もcのみを持つ。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
14
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
15 \lstinputlisting[label=src:agda-ds, caption=Agda における DataSegment の定義] {src/DataSegment.agda}
59
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
16 % }}}
58
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
17
59
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
18 % {{{ CodeSegment の定義
57
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 \section{CodeSegment の定義}
58
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
20 次に CodeSegment を定義する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
21 CodeSegment は DataSegment を取って DataSegment を返すものである。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
22 よって $ I \rightarrow O $ を内包するデータ型を定義する。
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 レコード型の型は Set なので、Set 型を持つ変数 I と O を型変数に持ったデータ型 CodeSegment を定義する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
25 I は Input DataSegment の型であり、 O は Output DataSegment である。
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 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
28 具体的なデータ型の定義はリスト ~\ref{src:agda-cs} のようになる。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
29
59
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
30 \lstinputlisting[label=src:agda-cs, caption= Agda における CodeSegment 型の定義] {src/CodeSegment.agda.replaced}
58
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
31
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
32 この CodeSegment 型を用いて CodeSegment の処理本体を記述する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
33
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
34 まず計算の本体となる cs0 に注目する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
35 cs0 は二つのInt型変数を持つ ds0 を取り、一つのInt型変数を作った上で cs1 に軽量継続を行なう。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
36 DataSegment はレコードなので、a と b のフィールドから値を取り出した上で加算を行ない、cを持つレコードを生成する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
37 そのレコードを引き連れたまま cs1 へと goto する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
38
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
39 次に cs1 に注目する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
40 cs1 は値に触れず cs2 へと goto するだけである。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
41 よって何もせずにそのまま goto する関数をコンストラクタ\verb/cs/ に渡すだけで良い。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
42
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
43 最後に cs2 である。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
44 cs2 はリスト~\ref{src:goto}では省略していたが、今回は計算を終了させる CodeSegment として定義する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
45 どの CodeSegment にも軽量継続せずに値を持ったまま計算を終了させる。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
46 コンストラクタ \verb/cs/ には関数を与えなくては値を構成できないため、何もしない関数である id を渡している。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
47
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
48 最後に計算をする cs0 へと軽量継続する main を定義する。
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
49 例として、 a の値を 100 とし、 b の値を50としている。
59
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
50
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
51 cs0, cs1, cs2, main をAgda で定義するとリスト~\ref{src:agda-css}のようになる。
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
52
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
53 \lstinputlisting[label=src:agda-css, caption= Agda における CodeSegment の定義] {src/CodeSegments.agda}
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
54
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
55 正しく計算が行なえたなら値150が得られるはずである。
5450e7ae5fa5 Mini fixes
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
56 % }}}
58
68bf744d726e Writing cs/ds in agda
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
57
60
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
58 % {{{ ノーマルレベル計算の実行
57
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 \section{ノーマルレベル計算の実行}
60
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
60 プログラムを実行することは \verb/goto/ を定義することと同義である。
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
61 軽量継続\verb/goto/ の性質としては
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
62
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
63 \begin{itemize}
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
64 \item 次に実行する CodeSegment を指定する
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
65 \item CodeSegment に渡すべき DataSegment を指定する
61
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
66 \item 現在実行している CodeSegment から制御を指定された CodeSegment へと移動させる
60
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
67 \end{itemize}
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
68
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
69 がある。
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
70 Agda における CodeSegment の本体は関数である。
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
71 関数をそのまま使用すると再帰を許してしまうために CbC との対応が失われてしまう。
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
72 よって、\verb/goto/を利用できるのは関数の末尾のみである、という制約を関数に付け加える必要がある。
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
73
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
74 この制約さえ満たせば、CodeSegment の実行は CodeSegment 型から関数本体を取り出し、レコード型を持つ値を適用することに相当する。
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
75 具体的に \verb/goto/ を関数として適用するとリスト~\ref{src:agda-goto}のようになる。
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
76
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
77 \lstinputlisting[label=src:agda-goto, caption=Agdaにおける goto の定義] {src/Goto.agda}
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
78
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
79 この \verb/goto/ の定義を用いることで main などの関数が評価できるようになり、値150が得られる。
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
80 本文中での CodeSegment の定義は一部を抜粋している。
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
81 実行可能な Agda のソースコードは付録に載せる。% TODO: Appendix
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
82
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
83 % }}}
ecd3a1e40921 Add normal level goto
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
84
61
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
85 % {{{ Meta DataSegment の定義
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
86
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
87 \section{Meta DataSegment の定義}
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
88 ノーマルレベルの CbC を Agda 上で記述し、実行することができた。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
89 次にメタレベルの計算を Agda 上で記述していく。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
90
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
91 Meta DataSegment はノーマルレベルの DataSegment の集合として定義できるものであり、全ての DataSegment の部分型であった。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
92 ノーマルレベルの DataSegment はプログラムによって変更されるので、事前に定義できるものではない。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
93 ここで、Agda の Parameterized Module を利用して、「Meta DataSegment の上位型は DataSegment である」のように DataSegment を定義する。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
94 こうすることにより、全てのプログラムは一つ以上の Meta DataSegment を持ち、任意の個数の DataSegment を持つ。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
95 また、Meta DataSegment をメタレベルの DataSegment として扱うことにより、「Meta DataSegment の部分型である Meta Meta DataSegment」を定義できるようになる。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
96 階層構造でメタレベルを表現することにより、計算の拡張を自在に行なうことができる。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
97
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
98 具体的な Meta DataSegment の定義はリスト~\ref{src:agda-mds}のようになる。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
99 型システム \verb/subtype/ は、Meta DataSegment である \verb/Context/ を受けとることにより構築される。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
100 Context を Meta DataSegment とするプログラム上では DataSegment は Meta CodeSegment の上位型となる。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
101 その制約を \verb/DataSegment/ 型は表わしている。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
102
62
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
103 \lstinputlisting[label=src:agda-mds, caption=Agda における Meta DataSegment の定義] {src/MetaDataSegment.agda.replaced}
61
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
104
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
105
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
106 ここで、関数を部分型に拡張する S-ARROW をもう一度示す。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
107
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
108 \begin{align*}
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
109 \AxiomC{$ T_1 <: S_1$}
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
110 \AxiomC{$ S_2 <: T_2$}
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
111 \BinaryInfC{$ S_1 \rightarrow S_2 <: T_1 \rightarrow T_2 $}
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
112 \DisplayProof && \text{S-ARROW}
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
113 \end{align*}
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
114
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
115 S-ARROW は、前提である部分型関係 $ T_1 <: S_1 $ と $ S_2 <: T_2 $ が成り立つ時に、 上位型 $ S_1 \rightarrow S_2 $ の関数を、部分型 $ T_1 \rightarrow T_2 $ に拡張できた。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
116 ここでの上位型は DataSegment であり、部分型は Meta DataSegment である。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
117 制約\verb/DataSegment/ の \verb/get/ は、 Meta DataSegment から DataSegment が生成できることを表す。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
118 これは前提 $ T_1 <: S_1 $ に相当する。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
119 そして、\verb/set/ は $ S_2 <: T_2 $ に相当する。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
120 しかし、任意の DataSegment が Meta DataSegment の部分型となるには、 DataSegment が Meta DataSegment よりも多くの情報を必ず持たなくてはならないが、これは通常では成り立たない。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
121 だが、メタ計算を行なう際には常に Meta DataSegment を一つ以上持っていると仮定するならば成り立つ。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
122 実際、GearsOS における赤黒木では Meta DataSegment に相当する \verb/Context/ を常に持ち歩いている。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
123 GearsOS における計算結果はその持ち歩いている Meta DataSegment の更新に相当するため、常に Meta DataSegment を引き連れていることを無視すれば DataSegment から Meta DataSegment を導出できる。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
124 よって $ S_2 <: T_2 $ が成り立つ。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
125
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
126 なお、 $ S_2 <: T_2 $ は Output DataSegment を Meta DataSegment を格納する作業に相当し、 $ T_1 <: S_1 $ は Meta DataSegment から Input DataSegment を取り出す作業であるため、これは明らかに \verb/stub/ である。
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
127
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
128 % }}}
3981580ece72 Add Meta DataSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 60
diff changeset
129
62
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
130 % {{{ Meta CodeSegment の定義
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
131
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
132 \section{Meta CodeSegment の定義}
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
133 Meta DataSegment が定義できたので Meta CodeSegment を定義する。
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
134 実際、DataSegment が Meta DataSegment に拡張できたため、Meta CodeSegment の定義には比較的変更は無い。
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
135 ノーマルレベルの \verb/CodeSegment/ 型に、DataSegment を取って DataSegment を返す、という制約を明示的に付けるだけである(リスト~\ref{src:agda-mcs})
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
136
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
137 \lstinputlisting[label=src:agda-mcs, caption=Agda における Meta CodeSegment の定義] {src/MetaCodeSegment.agda.replaced}
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
138
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
139 % }}}
a40033d3e10f Add Meta CodeSegment description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
140
63
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
141 % {{{ メタレベル計算の実行
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
142
57
3f58377a9f59 Split cbc-type.tex
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143 \section{メタレベル計算の実行}
63
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
144 Meta DataSegment と Meta CodeSegment の定義を行なったので、残るは実行である。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
145
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
146 実行はノーマルレベルにおいては軽量継続 \verb/goto/ を定義することによって表せた。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
147 メタレベル実行ではそれを Meta CodeSegment と Meta DataSegment を扱えるように拡張する。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
148 Meta DataSegment は Parameterized Module の引数 \verb/Context/ に相当するため、Meta CodeSegment は Context を取って Context を返す CodeSegment となる。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
149 軽量継続 \verb/goto/ と区別するために名前を \verb/exec/ とするリスト~\ref{src:agda-exec}のように定義できる。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
150 行なっていることは Meta CodeSegment の本体部分に Meta DataSegment を渡す、という \verb/goto/ と変わらないが、\verb/set/ と \verb/get/ を用いることで上位型である任意の DataSegment を実行する CodeSegment も Meta CodeSegment として一様に実行できる。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
151
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
152 \lstinputlisting[label=src:agda-exec, caption=Agda におけるメタレベル実行の定義] {src/Exec.agda.replaced}
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
153
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
154 実行例として、リスト~\ref{src:goto} に示していた a と b の値を加算して c に代入するプログラムを考える。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
155 実行する際に c の値を \verb/c'/ に保存してから加算ようなメタ計算を考える。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
156 c の値を \verb/c'/ に保存するタイミングは軽量継続時にユーザが指定する。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
157 よって軽量継続を行なうのと同等の情報を保持してなくてはならない。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
158 そのために Meta Meta DataSegment \verb/Meta/ には制御を移す対象であるノーマルレベル CodeSegment を持つ。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
159 値を格納する \verb/c'/ の位置は Meta DataSegment でも Meta Meta DataSegment でも構わないが、今回は Meta Meta DataSegemnt に格納するものとする。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
160 それらを踏まえた上での Meta Meta DataSegment の Agda 上での定義は~\ref{src:agda-mmds}のようになる。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
161 なお、\verb/goto/ などの名前の衝突を避けるためにノーマルレベルの定義は \verb/N/ に、メタレベルの定義は \verb/M/ へと名前を付けかえている。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
162
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
163 \lstinputlisting[label=src:agda-mmds, caption=Agda における Meta Meta DataSegment の定義例] {src/MetaMetaDataSegment.agda}
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
164
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
165 定義した \verb/Meta/ を利用して、c を \verb/c'/に保存するメタ計算 \verb/push/ を定義する。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
166 より構文が CbC に似るように \verb/gotoMeta/ を糖衣構文的に定義する。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
167 \verb/gotoMeta/ や \verb/push/ で利用している \verb/liftContext/ や \verb/liftMeta/ はノーマルレベル計算をメタ計算レベルとするように型を明示的に変更するものである。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
168 結果的に \verb/main/ の \verb/goto/ を \verb/gotoMeta/ に置き換えることにより、c の値を計算しながら保存できる。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
169 リスト~\ref{src:agda-mmcs} に示したプログラムでは、通常レベルのコードセグメントを全く変更せずにメタ計算を含む形に拡張している。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
170 加算を行なう前の \verb/c/ の値が \verb/70/ であったとした時、計算結果 \verb/150/ は \verb/c/ に格納されるが、\verb/c'/には\verb/70/に保存されている。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
171
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
172 \lstinputlisting[label=src:agda-mmcs, caption=Agda における Meta Meta CodeSegment の定義と実行例] {src/MetaMetaCodeSegment.agda}
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
173
64
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
174 なお、CbC におけるメタ計算を含む軽量継続\verb/goto meta/とAgda におけるメタ計算実行の比較はリスト~\ref{src:goto-meta}のようになる
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
175 % TODO: cbc と agda の diff
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
176
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
177 CodeSegment や Meta CodeSegment などの定義が多かっため、どの処理やデータがどのレベルに属するか複雑になったため、一度図にてまとめる。
63
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
178 Meta DataSegment を含む任意の DataSegment は Meta DataSegment になりえるので、この階層構造は任意の段数定義することが可能である。
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
179
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
180
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
181 % TODO: メタの階層構造の図
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
182
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
183 % }}}
6d8825f3b051 Add example of meta code segment execution
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
184
65
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
185 % {{{ Agda を用いた Continuation based C の検証
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
186
64
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
187 \section{Agda を用いた Continuation based C の検証}
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
188 Agda において CbC の CodeSegment と DataSegment を定義することができた。
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
189 実際の CbC のコードを Agda に変換し、それらの性質を証明していく。
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
190
65
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
191 ここではGearsOS が持つ DataSegment \verb/SingleLinkedStack/ を証明していく。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
192 この\verb/SingleLinkedStack/はポインタを利用した片方向リストを用いて実装されている。
64
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
193
65
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
194 CbC における DataSegment \verb/SingleLinkedStack/ の定義はリスト~\ref{src:cbc-stack}のようになっている。
64
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
195
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
196 \lstinputlisting[label=src:cbc-stack, caption=CbC における構造体 stack の定義] {src/stack.h}
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
197
65
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
198 次に Agda における \verb/SingleLinkedStack/の定義について触れるが、Agda にはポインタが無いため、メモリ確保や\verb/NULL/の定義は存在しない。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
199 CbC におけるメモリ確保部分はノーマルレベルには出現しないと仮定し、\verb/NULL/の表現にはAgda の標準ライブラリに存在する \verb/Data.Maybe/ を用いる。
64
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
200
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
201 \verb/Data.Maybe/ の \verb/maybe/ 型は、コンストラクタを二つ持つ。
65
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
202 片方のコンストラクタ \verb/just/ は値を持ったデータであり、ポインタの先に値があることに対応している。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
203 一方のコンストラクタ \verb/nothing/ は値を持たない。
64
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
204 これは値が存在せず、ポインタの先が確保されていない(\verb/NULL/ ポインタである)ことを表現できる。
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
205
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
206 \lstinputlisting[label=src:agda-maybe, caption=Agda における Maybe の定義] {src/Maybe.agda.replaced}
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
207
65
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
208 Maybe を用いて片方向リストを Agda 上に定義するとリスト~\ref{src:agda-stack}のようになる。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
209 CbC とほぼ同様の定義ができている。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
210 CbC、 Agda 共に\verb/SingleLinkedStack/ は \verb/Element/ 型の \verb/top/ を持っている。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
211 \verb/Element/ 型は値と次の \verb/Element/ を持つ。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
212 CbC ではポインタで表現していた部分が Agda では Maybe で表現されているが、\verb/Element/ 型の持つ情報は変わっていない。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
213
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
214 \lstinputlisting[label=src:agda-stack, caption=Agda における片方向リストを用いたスタックの定義] {src/AgdaStack.agda}
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
215
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
216 Agda で片方向リストを利用する DataSegment の定義をリスト~\ref{src:agda-stack-ds}に示す。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
217 ノーマルレベルからアクセス可能な場所として \verb/Context/ に \verb/element/ フィールドを追加する。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
218 そしてノーマルレベルからアクセスできないよう分離した Meta Meta DataSegment である \verb/Meta/ にスタックの本体を格納する。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
219 CbC における実装では \verb/.../ で不定であった \verb/next/ も、agda ではメタレベルのコードセグメント \verb/nextCS/ となり、きちんと型付けされている。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
220
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
221 \lstinputlisting[label=agda-stack-ds, caption=スタックを利用するための DataSegment の定義] {src/AgdaStackDS.agda}
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
222
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
223 次にスタックへの操作に注目する。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
224 スタックへと値を積む \verb/pushSingleLinkedStack/ と値を取り出す \verb/popSingleLinkedStack/ の CbC 実装をリスト~\ref{src:cbc-push-pop}に示す。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
225 \verb/SingleLinkedStack/ は Meta CodeSegment であり、メタ計算を実行した後には通常の CodeSegment へと操作を移す。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
226 そのために \verb/next/ という名前で次のコードセグメントを保持している。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
227 具体的な \verb/next/ はコンパイル時にしか分からないため、\verb/.../ 構文を用いて不定としている。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
228
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
229 \verb/pushSingleLinkedStack/ は \verb/element/ を新しく確保し、値を入れた後に \verb/next/ へと繋げ、 \verb/top/ を更新して軽量継続する。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
230 \verb/popSingleLinkedStack/ は先頭が空でなければ先頭の値を \verb/top/ から取得し、\verb/element/を一つ進める。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
231 値が空であれば \verb/data/ を \verb/NULL/ にしたまま軽量継続を行なう。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
232
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
233 \lstinputlisting[label=src:cbc-push-pop, caption= CbC における SingleLinkedStack を操作する Meta CodeSegment] {src/singleLinkedStack.c}
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
234
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
235 次に Agda における定義をリスト~\ref{src:agda-push-pop}に示す。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
236 同様に \verb/pushSingleLinkedStack/ と \verb/popSingleLinkedStack/ を定義している。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
237 \verb/pushsinglelinkedstack/ では、スタックの値を更新したのちにノーマルレベルの CodeSegment である \verb/n/ を \verb/exec/ している。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
238 なお、 \verb/liftMeta/ はノーマルレベルの計算をメタレベルとする関数である。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
239
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
240 実際に値を追加する部分は where 句に定義された関数 \verb/push/ である。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
241 これはスタックへと積む値が空であれば追加を行なわず、値がある時は新たに element を作成して top を更新している。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
242 本来の CbC の実装では空かチェックはしていないが、値が空であるかに関わらずにスタックに積んでいるために挙動は同じである。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
243
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
244 次に \verb/popSingleLinkedStack/ に注目する。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
245 こちらも操作後に \verb/nextCS/ へと継続を移すようになっている。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
246
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
247 実際に値を取り出す操作はノーマルレベルからアクセスできる \verb/element/ の値の確定と、アクセスできない \verb/stack/ の更新である。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
248
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
249 \verb/element/については、 \verb/top/ が空なら取り出した後の値は無いので \verb/element/ は \verb/nothing/ である。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
250 \verb/top/ が空でなければ \verb/element/ は \verb/top/ の値となる。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
251
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
252 \verb/stack/ は空なら空のままであり、\verb/top/ に値があればその先頭を捨てる。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
253 ここで、\verb/pop/ の実装はスタックが空であっても、例外を送出したり停止したりせずに処理を続行できることが分かる。
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
254
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
255 \lstinputlisting[label=src:agda-push-pop, caption=Agda における片方向リストを用いたスタックの定義] {src/AgdaPushPop.agda}
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
256
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
257 また、この章で取り上げた CbC と Agda の動作するソースコードは付録に載せる。 % TODO
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
258
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
259 % }}}
c0693ad89f04 Add single linked stack
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 64
diff changeset
260
66
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
261 \section{スタックの実装の検証}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
262 定義した SingleLinkedStack に対して証明を行なっていく。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
263 ここでの証明は SingleLinkedStack の処理が特定の性質を持つことを保証することである。
64
10a550bf7e4a Mini fixes with ryokka-san
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
264
66
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
265 例えば
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
266
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
267 \begin{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
268 \item スタックに積んだ値は取り出せる
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
269 \item 値は複数積むことができる
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
270 \item スタックから値を取り出すことができる
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
271 \item スタックから取り出す値は積んだ値である
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
272 \item スタックから値を取り出したらその値は無くなる
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
273 \item スタックに値を積んで取り出すとスタックの内容は変わらない
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
274 \end{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
275
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
276 といった多くの性質がある。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
277
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
278 ここでは、最後に示した「スタックに値を積んで取り出すとスタックの内容は変わらない」ことについて示していく。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
279 この性質を具体的に書き下すと以下のようになる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
280
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
281 \begin{definition}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
282 任意のスタック s に対して
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
283
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
284 \begin{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
285 \item 任意の値n
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
286 \item 値xを積む操作 push(x, s)
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
287 \item 値を一つスタックから取り出す操作 pop(s)
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
288 \end{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
289
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
290 がある時、
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
291
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
292 pop . push(n) s = s
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
293
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
294 である。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
295 \end{definition}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
296
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
297 これを Agda 上で定義するとリスト~\ref{src:agda-push-pop-type-1} のようになる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
298 Agda 上の定義ではスタックそのものではなく、スタックを含む任意の \verb/Meta/ に対してこの性質を証明する。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
299 この定義が \verb/Meta/ の値によらず成り立つことを、自然数の加算の交換法則と同様に等式変形を用いて証明していく。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
300
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
301 \lstinputlisting[label=src:agda-push-pop-type-1, caption=Agda におけるスタックの性質の定義(1)] {src/PushPopType.agda.replaced}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
302
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
303 今回注目する条件分けは、スタック本体である \verb/stack/ と、push や pop を行なうための値を格納する \verb/element/ である。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
304 それぞれが持ち得る値を場合分けして考えていく。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
305
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
306 \begin{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
307 \item スタックが空である場合
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
308
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
309 \begin{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
310 \item element が存在する場合
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
311
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
312 値が存在するため、 push は実行される。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
313 push が実行されたためスタックに値があるため、pop が成功する。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
314 pop が成功した結果スタックは空となるため元のスタックと同一となり成り立つ。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
315
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
316 \item element が存在しない場合
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
317
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
318 値が存在しないため、 push が実行されない。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
319 push が実行されなかったため、スタックは空のままであり、pop も実行されない。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
320 結果スタックは空のままであり、元のスタックと一致する。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
321 \end{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
322
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
323 \item スタックが空でない場合
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
324
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
325 \begin{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
326 \item element が存在する場合
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
327
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
328 element に設定された値 n が push され、スタックに一つ値が積まれる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
329 スタックの先頭は n であるため、pop が実行されて n は無くなる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
330 結果、スタックは実行する前の状態に戻る。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
331
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
332 \item element が存在しない場合
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
333
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
334 element に値が存在しないため、push は実行されない。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
335 スタックは空ではないため、popが実行され、先頭の値が無くなる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
336 実行後、スタックは一つ値を失なっているため、これは成りたたない。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
337 \end{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
338 \end{itemize}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
339
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
340 スタックが空でなく、push する値が存在しないときにこの性質は成り立たないことが分かった。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
341 また、\verb/element/ が空でない制約を仮定に加えることでこの命題は成り立つようになる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
342
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
343 push 操作と pop 操作を連続して行なうとスタックが元に復元されることは分かった。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
344 ここで SingleLinkedStack よりも範囲を広げて \verb/Meta/ も復元されるかを考える。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
345 一見これも自明に成り立ちそうだが、push 操作と pop 操作は操作後に実行される CodeSegment を持っている。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
346 この CodeSegment は任意に設定できるため、\verb/Meta/ 内部の DataSegement が書き換えられる可能性がある。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
347 よってこれも制約無しでは成り立たない。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
348
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
349 逆にいえば、CodeSegment を指定してしまえば \verb/Meta/ に関しても push/pop の影響を受けないことを保証できる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
350 全く値を変更しない CodeSegment \verb/id/ を指定した際には自明にこの性質が導ける。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
351 実際、 Agda 上でも等式変形を明示的に指定せず、定義からの推論でこの証明を導ける(リスト~\ref{src:agda-push-pop-proof})。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
352
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
353 なお、今回 SingleLinkedStack に積むことができる値は Agda の標準ライブラリ(\verb/Data.Nat/)における自然数型 $ \mathbb{N} $ としている。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
354 push/pop 操作の後の継続が \verb/Meta/ に影響を与えない制約は \verb/id-meta/ に表れている。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
355 これは \verb/Meta/ を構成する要素を受け取り、継続先の CodeSegment に恒等関数 \verb/id/ を指定している。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
356 加えて、スタックが空で無い制約 where 句の \verb/meta/ に表れている。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
357 必ずスタックの先頭 \verb/top/ には値xが入っており、それ以降の値は任意としている。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
358 よってスタックは必ず一つ以上の値を持ち、空でないという制約を表わせる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
359 証明は refl によって与えられる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
360 つまり定義から自明に推論可能となっている。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
361
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
362 \lstinputlisting[label=src:agda-push-pop-proof, caption=Agdaにおけるスタックの性質の証明(1)] {src/AgdaPushPopProof.agda.replaced}
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
363
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
364 ここで興味深い点は、 SingleLinkedStack の実装から証明に仮定が必要なことが証明途中でに分かった点にある。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
365 例えば、CbC の SingleLinkedStack 実装の push/pop 操作は失敗しても成功しても指定された CodeSegment に軽量継続する。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
366 この性質により、指定された CodeSegment によっては、スタックの操作に関係なく \verb/Meta/ の内部の DataSegemnt が書き換えられる可能性があることが分かった。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
367 スタックの操作の際に行なわれる軽量継続の利用方法は複数考えられる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
368 例えば、スタックが空である際に pop を行なった時はエラー処理用の継続を行なう、といった実装も可能である。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
369 実装が異なれば、同様の性質でも証明は異なるものとなる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
370 このように、実装そのものを適切に型システムで定義できれば、明示されていない実装依存の仕様も証明時に確定させることができる。
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
371
40ae32725e55 Add push/pop description
atton <atton@cr.ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
372 // n-pop / n-push