annotate paper/cbc_agda.tex @ 2:c7acb9211784

add code, figure. and paper fix content
author ryokka
date Mon, 27 Jan 2020 20:41:36 +0900
parents 41a936510fd0
children a6f371a5d33d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
41a936510fd0 Initialize
ryokka
parents:
diff changeset
1 \chapter{Continuation based C と Agda}
41a936510fd0 Initialize
ryokka
parents:
diff changeset
2
2
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
3 本章では当研究室で推奨している単位での検証を行うため、
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
4 Agda 上で CodeGear、 DataGear の表現を示す。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
5 また、Gear の単位と Hoare Logic を対応させ、
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
6 CbC 上での Hoare Logic について説明を行う。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
7
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
8
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
9 \section{DataGear と Agda}
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
10 Agda での DataGear は CodeGear で扱うすべてのデータである。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
11
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
12
0
41a936510fd0 Initialize
ryokka
parents:
diff changeset
13
2
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
14 \section{CodeGear と Agda}
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
15 CodeGear は DataGear を受け取って処理を行い DataGear を返す。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
16 また、CodeGear 間の移動は継続を用いて行われる。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
17 継続は関数呼び出しとは異なり、呼び出した後に元のコードに戻らず、
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
18 次の CodeGear へ継続を行う。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
19 これは、関数型プログラミングでは末尾関数呼び出しを行うことに相当するため、
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
20 継続渡し(Continuation Passing Style) で書かれた Agda の関数と対応する。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
21 継続は不定の型 (\verb+t+) を返す関数で表される。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
22 CodeGear は次に実行する関数の型を引数として受け取り不定の型\verb+t+を返す関数として記述され、
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
23 CodeGear 自体も同じ型 \verb+t+ を返す関数となる。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
24 コード \ref{agda-cg} は Agda で記述した CodeGear の例である。
0
41a936510fd0 Initialize
ryokka
parents:
diff changeset
25
2
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
26 \lstinputlisting[caption= whileTest の型,label=agda-cg]{src/while-test.agda.replaced}
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
27 %% Agda のとこで Level の話を…!
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
28 ここでは \verb+c10+ と名付けた自然数を受け取った後、
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
29 \varb+Env+ を受け取って不定の型\verb+t+を返す関数を受け取り、
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
30 \verb+t+を返す CodeGear を定義している。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
31
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
32
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
33
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
34 \section{Meta CodeGear の表現}
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
35 Meta CodeGear は 通常の CodeGear では扱えないメタレベルの計算を扱う CodeGear である。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
36 Agda での Meta CodeGear は通常の CodeGear を引数に取りそれらの関係などの上位概念を返す CodeGear である。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
37 これは(図を入れる)のような Code Gear となる。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
38
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
39 % \lstinputlisting[label=src:agda-cs, caption= Agda における CodeGear 型の定義] {src/CodeSegment.agda.replaced}
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
40
0
41a936510fd0 Initialize
ryokka
parents:
diff changeset
41
41a936510fd0 Initialize
ryokka
parents:
diff changeset
42 \section{CbC 上での HoareLogic の実現}
2
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
43 CbC 上の Hoare Logic は引数として事前条件、次の CodeGear に渡す値に事後条件を含めることで記述する。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
44 その際に事前条件が CodeGear で変更され、事後条件を導く形になる。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
45 例として while プログラムの CbC 記述についてみる。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
46
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
47 %% コード
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
48 ここでは~
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
49
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
50 Hoare Logic の記述としてはこれで良く、部分整合性は示せているが、
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
51 全体の検証を行うためには接続されているすべての CodeGear が実行されたときの健全性(Soundness)が担保される必要がある。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
52 そのため、検証用の Meta CodeGear を記述する。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
53 例として while プログラムの健全性を担保するプログラムをみる。
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
54 %% コード
c7acb9211784 add code, figure. and paper fix content
ryokka
parents: 0
diff changeset
55 このコードでは CodeGear をつなげて終了状態まで実行したとき最後の事後条件が成り立っているため、これらの実行が正しく終了することを示すことができる。