view Paper/tex/cbc_agda.tex @ 7:6a61c1eb0205

これを提出した
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Thu, 12 May 2022 15:44:39 +0900
parents 9ec2d2ac1309
children
line wrap: on
line source

\section{GearsAgda 形式で書く Agda}
CbC の継続の概念を取り入れた Agda の記法を説明する.
Agdaでは関数の再帰呼び出しが可能であるが,CbCでは値が 帰って来ない.そのためAgda
で実装を行う際には再帰呼び出しを行わないようにする.

以下で Gears Agda の記述方法を足し算を行うプログラムを用いて説明する.

\lstinputlisting[caption= Agdaでの Data Gear の定義, label=agda-dg, firstline=6, lastline=11]{src/agda/cbc-agda.agda.replaced}

\lstinputlisting[caption= Agdaでの Code Gear の定義, label=agda-cg, firstline=12, lastline=16]{src/agda/cbc-agda.agda.replaced}

\lstinputlisting[caption= Agdaでの 停止性が示せない CodeGear の例, label=agda-not-cg, firstline=18, lastline=22]{src/agda/cbc-agda.agda.replaced}

\lstinputlisting[caption= Agdaでの CodeGear の初期化, label=agda-exec-cg, firstline=24]{src/agda/cbc-agda.agda.replaced}

Code \ref{agda-dg}が Data Gear の定義をしている.
今回は足し算を実装するので,varx に vary を足すことを考える.
そのためそれらが2つの自然数を持つようにしている.

Code \ref{agda-cg}では Code Gear の定義になる.
最初に Data Gear となる env を受け取ったあと,そのまま次の関数に遷移させている.

Agda の記述は Curry-Howard 対応になっていて,
最初に関数名のあとに:(コロン)の後ろに命題を記述し,
そのあとに関数名のあとに引数を書き,=(イコール)の後ろに定義を記述しています.

Gears Agda での Code Gear の命題は必ず (Env $\rightarrow$ t) $\rightarrow$ t で終了するようになっている.
この (Env $\rightarrow$ t) は引数で受け取る型で Env を受け取ってtを返すという意味になる.
これが Code Gear を実行したあとの末尾関数呼び出しを行う次の Code Gear となる.
最後にtを返すとなっているのは,これ自体が Code Gear であることを示している.

受け取ったあとに別の関数に再度渡している.
これは後述するが,Agda の繰り返し処理を行う際に停止性を見失うために減少列を引数に取っている.
内部の処理は reducer を減らしながらvarxを増やし,
vary の値を varx に与えていくことで足し算を定義している.
基本的に繰り返し実行するコードを実装する場合には,
実行時に減少しその関数がいずれ停止することを示す reducer を含めるようにしている.

reducerを含めなかった際の Code Gear を Code \ref{agda-not-cg}に示す.
Agdaではパターンマッチを行うことで場合分けを考えることができるが,
受け取った Code Gear であるenvを with を使用してパターンマッチを試みている.
パターンマッチ自体は可能だが,この方法だとAgdaが関数が停止することを認識できない.
そのため,\{-$\#$ TERMINATING $\#$-\} を関数定義の前にアノテーションし
この関数が停止することを記述してコンパイルが通るようにしている.

Code \ref{agda-exec-cg} は受け取った引数で Data Gear を初期化して
それを Code Gear に与えることで実行を行っている.
今回の例では 引数から Data Gear を作成するのは
複雑ではないため,一度で Data Gear を作成してそれを Code Gear に渡している
引数から Data Gear を作成するのが複雑な場合は一度 入力から
Data Gear を作成する Code Gear を用いる.
加えて,実行なので命題の部分の最後が Env になっている.

\subsection{Agda による Meta Gears}
通常の Meta Gears はノーマルレベルの CodeGear, DataGear では扱えないメタレベルの計算を扱う単位である.
今回はモデル検査を行う際に使用する

\begin{itemize}
\item Meta DataGear \mbox{}\\
  Agda 上で Meta DataGear を持つことでデータ構造自体が関係を持つデータを作ることができる.
  通常の Data Gear を wraping している.今回はこれを用いることで,モデル検査の状態を保存する

\item Meta CodeGear\mbox{}\\
  Meta CodeGear は 通常の CodeGear では扱えないメタレベルの計算を扱う CodeGear
  である.Agda での Meta CodeGear は Meta DataGear を引数に取りそれらの関係を返
  す CodeGear である.今回はここでモデル検査を行う
\end{itemize}