annotate Paper/tex/cbc_agda.tex @ 5:6c0b1fcbac2d

FIX SIGの論文ルールに基づいて修正
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Thu, 05 May 2022 17:38:06 +0900
parents 7434c0aa1859
children 9ec2d2ac1309
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
1 \section{GearsAgda 形式で書く agda}
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
2 CbC の継続の概念を取り入れた Agda の記法を説明する.
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
3 Agdaでは関数の再帰呼び出しが可能であるが,CbCでは値が 帰って来ない.そのためAgda
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
4 で実装を行う際には再帰呼び出しを行わないようにする.
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
5
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
6 以下で Gears Agda の記述方法を足し算を行うプログラムを用いて説明する.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
8 \lstinputlisting[caption= Agdaでの Data Gear の定義, label=agda-dg, firstline=6, lastline=11]{src/agda/cbc-agda.agda.replaced}
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
9
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
10 \lstinputlisting[caption= Agdaでの Code Gear の定義, label=agda-cg, firstline=12, lastline=16]{src/agda/cbc-agda.agda.replaced}
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
11
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
12 \lstinputlisting[caption= Agdaでの 停止性が示せない CodeGear の例, label=agda-not-cg, firstline=18, lastline=22]{src/agda/cbc-agda.agda.replaced}
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
14 \lstinputlisting[caption= Agdaでの CodeGear の初期化, label=agda-exec-cg, firstline=24]{src/agda/cbc-agda.agda.replaced}
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
15
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
16 Code \ref{agda-dg}が Data Gear の定義をしている.
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
17 今回は足し算を実装するので,varx に vary を足すことを考える.
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
18 そのためそれらが2つの自然数を持つようにしている.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
20 Code \ref{agda-cg}では Code Gear の定義になる.
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
21 最初に Data Gear となる env を受け取ったあと,そのまま次の関数に遷移させている.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
23 Agda の記述は Curry-Howard 対応になっていて,
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
24 最初に関数名のあとに:(コロン)の後ろに命題を記述し,
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
25 そのあとに関数名のあとに引数を書き,=(イコール)の後ろに定義を記述しています.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
27 Gears Agda での Code Gear の命題は必ず (Env $\rightarrow$ t) $\rightarrow$ t で
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
28 終了するようになっている.この (Env $\rightarrow$ t) は引数で受け取る型で Env を
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
29 受け取ってtを返すという意味になる.これが Code Gear を実行したあとの末尾関数呼び出しを
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
30 行う次の Code Gear となる. 最後にtを返すとなっているのは,これ自体が Code Gear であることを
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
31 示している.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
33 受け取ったあとに別の関数に再度渡している.
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
34 これは後述するが,Agdaの繰り返し処理を行う際に停止性を
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
35 見失うために減少列を引数に取っている.
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
36
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
37 内部の処理はreducerを減らしながらvarxを増やすことで
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
38 varyの値をvarxに与えていくことで足し算を定義している.
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
39
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
40 基本的に繰り返し実行するコードを実装する場合には
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
41 実行時に減少し,その関数がいずれ停止することを示す
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
42 reducerを含めるようにしている.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
44 reducerを含めなかった際の Code Gear を Code \ref{agda-not-cg}に示す.
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
45 agdaではパターンマッチを行うことで場合分けを考えることができるが,
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
46 受け取った Code Gear であるenvを with を使用してパターンマッチを試みている.
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
47 パターンマッチ自体は可能だが,この方法だとAgdaが関数が停止することを認識できない.
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
48 そのため,\{-$\#$ TERMINATING $\#$-\} を関数定義の前にアノテーションし
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
49 この関数が停止することを記述してコンパイルが通るようにしている.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
51 Code \ref{agda-exec-cg} は受け取った引数で Data Gear を初期化して
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
52 それを Code Gear に与えることで実行を行っている.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
54 今回の例では 引数から Data Gear を作成するのは
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
55 複雑ではないため,一度で Data Gear を作成してそれを Code Gear に渡している
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
56 引数から Data Gear を作成するのが複雑な場合は一度 入力から
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
57 Data Gear を作成する Code Gear を用いる.
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
58
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
59 加えて,実行なので命題の部分の最後が Env になっている.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 \subsection{agda による Meta Gears}
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
62 通常の Meta Gears はノーマルレベルの CodeGear, DataGear では扱えないメタレベルの計算を扱う単位である.
2
f9794e92f964 WIP 8割くらいできた
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
63 今回はモデル検査を行う際に使用する
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 \begin{itemize}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 \item Meta DataGear \mbox{}\\
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
67 Agda 上で Meta DataGear を持つことでデータ構造自体が関係を持つデータを作ることができる.
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
68 通常の Data Gear を wraping している.今回はこれを用いることで,モデル検査の状態を保存する
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 \item Meta CodeGear\mbox{}\\
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71 Meta CodeGear は 通常の CodeGear では扱えないメタレベルの計算を扱う CodeGear
5
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
72 である.Agda での Meta CodeGear は Meta DataGear を引数に取りそれらの関係を返
6c0b1fcbac2d FIX SIGの論文ルールに基づいて修正
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 4
diff changeset
73 す CodeGear である.今回はここでモデル検査を行う
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 \end{itemize}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75