Mercurial > hg > Papers > 2021 > soto-prosym
view Paper/tex/cbc_agda.tex @ 6:7ba9fa08ffb4
temporary DONE
author | soto <soto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 10 Nov 2021 10:34:48 +0900 |
parents | c59202657321 |
children |
line wrap: on
line source
\section{Continuation based C と Agda} 本章では CbC に対応した Agda を記述する際の手法を説明する。 \subsection{GearsAgda 形式で書く agda} Agdaでは関数の再帰呼び出しが可能であるが、CbCでは値が 帰って来ない。そのためAgda で実装を行う際には再帰呼び出しを行わないようにする。 code \ref{agda-cg}が例となるコードである。 \lstinputlisting[caption= Agdaでの CodeGear の例, label=agda-cg, firstline=6]{src/agda/cbc-agda.agda.replaced} 1行目で Data Gear の定義を行っている。 今回は 2つの数値の足し算を行うコードを実装するため、 varx と vary の二つの自然数を持つ。 7行目の plus-com が受け取っている値を定義している。 Env と next と exit を受け取っている。 next と next は Env → t となっているが、 これは Env を受け取って不定の型 (t) を返すという意味である。 これで 次の関数遷移先を取れるようにしている。 9行目から10行目では入ってきた varx で場合分けを行っており、varx が zero ならそのまま vary を返し、次の遷移先へ、 varx が zero 以外なら varx から1を引いて、vary に 1 を足して遷移する。 13行目でxがzero以外の値であった場合の遷移先を指定している。 ここでは自身である plus-p をループするように指定した。 CbCでは再起処理を実装することはできないが、自己呼び出しを行うことはできるので、 それに合ったようにAgdaでも実装を行なう。 17行目が実際に値を入れる部分で、 Exitが実行の終了になるようにしている。 前述した加算を行うコードと比較すると、不定の型 (t) により継続を行なっている部分が見える。 これがAgdaで表現された CodeGear となり、本論では Gears Agda と呼ぶ \subsection{agda による Meta Gears} 通常の Meta Gears はノーマルレベルの CodeGear、 DataGear では扱えないメタレベルの計算を扱う単位である。 今回はその Meta Gears をAgdaによる検証の為に用いる。 \begin{itemize} \item Meta DataGear \mbox{}\\ Agda 上で Meta DataGear を持つことでデータ構造自体が関係を持つデータを作ることができる。 これを用いることで、仕様となる制約条件を記述することができる。 \item Meta CodeGear\mbox{}\\ Meta CodeGear は 通常の CodeGear では扱えないメタレベルの計算を扱う CodeGear である。Agda での Meta CodeGear は Meta DataGear を引数に取りそれらの関係を返 す CodeGear である。故に、Meta CodeGear は Agda で記述した CodeGear の検証そのものである \end{itemize}