comparison paper/cbc-type.tex @ 100:ebe838b83ada

Self review
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Sun, 12 Feb 2017 11:52:20 +0900
parents a891d7551bbf
children 5ad74fb83f72
comparison
equal deleted inserted replaced
99:a891d7551bbf 100:ebe838b83ada
141 実際、DataSegment が Meta DataSegment に拡張できたため、Meta CodeSegment の定義には比較的変更は無い。 141 実際、DataSegment が Meta DataSegment に拡張できたため、Meta CodeSegment の定義には比較的変更は無い。
142 ノーマルレベルの \verb/CodeSegment/ 型に、DataSegment を取って DataSegment を返す、という制約を明示的に付けるだけである(リスト~\ref{src:agda-mcs}) 142 ノーマルレベルの \verb/CodeSegment/ 型に、DataSegment を取って DataSegment を返す、という制約を明示的に付けるだけである(リスト~\ref{src:agda-mcs})
143 143
144 \lstinputlisting[label=src:agda-mcs, caption=Agda における Meta CodeSegment の定義] {src/MetaCodeSegment.agda.replaced} 144 \lstinputlisting[label=src:agda-mcs, caption=Agda における Meta CodeSegment の定義] {src/MetaCodeSegment.agda.replaced}
145 145
146 メタレベルの定義を部分型で行なって分かったことには以下のようなものがある。
147
148 \begin{itemize}
149 \item メタ計算は階層構造化できる
150
151 メタ計算は階層構造を取ることができるため、組み合わせることも可能である。
152
153 \item 継続先が不定の場合は型を一様に扱う必要がある
154
155 メタ計算がノーマルレベルの具体的な型を知ることができるのはコンパイル時のみである。
156 よってメタ計算を定義する時は部分型制約しか記述できない。
157 逆に言えばノーマルレベル計算のみであれば部分型は解決され、レコード型で型付けができる。
158
159 \item \verb/stub/ は部分型付けにおいても必要である
160
161 GearsOS では Meta DataSegment から DataSegment を取り出すための処理として \verb/stub/ が存在していた。
162 これは Meta DataSegment で一様に扱っていた DataSegment に型を戻す処理として、型システムにおいても必要なものである。'
163 また、型システム経由で \verb/stub/ を生成することも可能であると考えられる。
164
165 \end{itemize}
166
146 % }}} 167 % }}}
147 168
148 % {{{ メタレベル計算の実行 169 % {{{ メタレベル計算の実行
149 \section{メタレベル計算の実行} 170 \section{メタレベル計算の実行}
150 \label{section:meta-level-exec} 171 \label{section:meta-level-exec}
196 % {{{ Agda を用いた Continuation based C の証明 217 % {{{ Agda を用いた Continuation based C の証明
197 218
198 \section{Agda を用いた Continuation based C の証明} 219 \section{Agda を用いた Continuation based C の証明}
199 \label{section:cbc-proof} 220 \label{section:cbc-proof}
200 Agda において CbC の CodeSegment と DataSegment を定義することができた。 221 Agda において CbC の CodeSegment と DataSegment を定義することができた。
201 実際の CbC のコードを Agda に変換し、それらの性質を証明していく。 222 実際の CbC のコードを Agda で記述し、それらの性質を証明していく。
202 223
203 ここではGearsOS が持つ DataSegment \verb/SingleLinkedStack/ を証明していく。 224 ここではGearsOS が持つ DataSegment \verb/SingleLinkedStack/ を証明していく。
204 この\verb/SingleLinkedStack/はポインタを利用した片方向リストを用いて実装されている。 225 この\verb/SingleLinkedStack/はポインタを利用した片方向リストを用いて実装されている。
205 226
206 CbC における DataSegment \verb/SingleLinkedStack/ の定義はリスト~\ref{src:cbc-stack}のようになっている。 227 CbC における DataSegment \verb/SingleLinkedStack/ の定義はリスト~\ref{src:cbc-stack}のようになっている。
446 467
447 push-pop を一般化した n-push-pop を証明することができた。 468 push-pop を一般化した n-push-pop を証明することができた。
448 n-push-pop は証明の途中で補題 pop-n-push と push-pop を利用した定理である。 469 n-push-pop は証明の途中で補題 pop-n-push と push-pop を利用した定理である。
449 このように、CbC で記述されたプログラムを Agda 上に記述することで、データ構造の性質を定理として証明することができた。 470 このように、CbC で記述されたプログラムを Agda 上に記述することで、データ構造の性質を定理として証明することができた。
450 これらの証明機構を CbC のコンパイラやランタイム、モデルチェッカなどに組み込むことにより CbC は CbC で記述されたコードを証明することができるようになる。 471 これらの証明機構を CbC のコンパイラやランタイム、モデルチェッカなどに組み込むことにより CbC は CbC で記述されたコードを証明することができるようになる。
451 なお、本論文で取り扱っている Agda のソースコードは視認性の向上のために暗黙的な引数を省略して記述している。 472 なお、本論文で取り扱っている Agda のソースコードは可読性の向上のために暗黙的な引数を省略している。
452 動作する完全なコードは付録に付す。 473 完全なコードは付録に付す。
453 474
454 % }}} 475 % }}}
476