comparison paper/cbc-type.tex @ 64:10a550bf7e4a

Mini fixes with ryokka-san
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Fri, 03 Feb 2017 14:49:58 +0900
parents 6d8825f3b051
children c0693ad89f04
comparison
equal deleted inserted replaced
63:6d8825f3b051 64:10a550bf7e4a
169 リスト~\ref{src:agda-mmcs} に示したプログラムでは、通常レベルのコードセグメントを全く変更せずにメタ計算を含む形に拡張している。 169 リスト~\ref{src:agda-mmcs} に示したプログラムでは、通常レベルのコードセグメントを全く変更せずにメタ計算を含む形に拡張している。
170 加算を行なう前の \verb/c/ の値が \verb/70/ であったとした時、計算結果 \verb/150/ は \verb/c/ に格納されるが、\verb/c'/には\verb/70/に保存されている。 170 加算を行なう前の \verb/c/ の値が \verb/70/ であったとした時、計算結果 \verb/150/ は \verb/c/ に格納されるが、\verb/c'/には\verb/70/に保存されている。
171 171
172 \lstinputlisting[label=src:agda-mmcs, caption=Agda における Meta Meta CodeSegment の定義と実行例] {src/MetaMetaCodeSegment.agda} 172 \lstinputlisting[label=src:agda-mmcs, caption=Agda における Meta Meta CodeSegment の定義と実行例] {src/MetaMetaCodeSegment.agda}
173 173
174 メタの階層構造を表すと図のようになる。 174 なお、CbC におけるメタ計算を含む軽量継続\verb/goto meta/とAgda におけるメタ計算実行の比較はリスト~\ref{src:goto-meta}のようになる
175 % TODO: cbc と agda の diff
176
177 CodeSegment や Meta CodeSegment などの定義が多かっため、どの処理やデータがどのレベルに属するか複雑になったため、一度図にてまとめる。
175 Meta DataSegment を含む任意の DataSegment は Meta DataSegment になりえるので、この階層構造は任意の段数定義することが可能である。 178 Meta DataSegment を含む任意の DataSegment は Meta DataSegment になりえるので、この階層構造は任意の段数定義することが可能である。
176 179
177 180
178 % TODO: メタの階層構造の図 181 % TODO: メタの階層構造の図
179 182
180 % }}} 183 % }}}
181 184
182 \section{Agda を用いたContinuation based C の検証} 185 \section{Agda を用いた Continuation based C の検証}
186 Agda において CbC の CodeSegment と DataSegment を定義することができた。
187 実際の CbC のコードを Agda に変換し、それらの性質を証明していく。
188
189 ここでは赤黒木の実装に用いられているスタックの性質について注目する。
190 この時のスタックはポインタを利用した片方向リストを用いる。
191
192 CbC における構造体 \verb/stack/ の定義はリスト~\ref{src:cbc-stack}のようになっている。
193
194 \lstinputlisting[label=src:cbc-stack, caption=CbC における構造体 stack の定義] {src/stack.h}
195
196 Agda にはポインタが無いため、メモリ確保や\verb/NULL/の定義は存在しない。
197 CbC におけるメモリ確保部分はノーマルレベルには出現しないと仮定して、\verb/NULL/の表現にはAgda の標準ライブラリに存在する \verb/Data.Maybe/ を用いる。
198
199 \verb/Data.Maybe/ の \verb/maybe/ 型は、コンストラクタを二つ持つ。
200 片方のコンストラクタ \verb/just/ は値を持つ。
201 これは計算を行なうことができる値であり、ポインタの先に値があることに対応している。
202 一方のコンストラツア \verb/nothing/ は値を持たない。
203 これは値が存在せず、ポインタの先が確保されていない(\verb/NULL/ ポインタである)ことを表現できる。
204
205 \lstinputlisting[label=src:agda-maybe, caption=Agda における Maybe の定義] {src/Maybe.agda.replaced}
206
207
183 \section{スタックの実装の検証} 208 \section{スタックの実装の検証}