annotate final_main/chapter5.tex @ 17:7d2b1d8309ba

update pdf
author e155702
date Tue, 19 Feb 2019 01:04:55 +0900
parents 83f997abf3b5
children c9142e57399f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
83f997abf3b5 first commit
e155702
parents:
diff changeset
1 \chapter{Agda による CbC の証明}
83f997abf3b5 first commit
e155702
parents:
diff changeset
2
83f997abf3b5 first commit
e155702
parents:
diff changeset
3 前章では Agda で CodeGear や DataGear の定義を示した。また、 CbC のコード
83f997abf3b5 first commit
e155702
parents:
diff changeset
4 を Agda にマッピングし等価なコードを生成できることを示した。
83f997abf3b5 first commit
e155702
parents:
diff changeset
5 本章では前章で生成した Interface の Stack や Tree のコードを使い Agda で
83f997abf3b5 first commit
e155702
parents:
diff changeset
6 Interface を経由したコードでの証明が可能であることを示す。
83f997abf3b5 first commit
e155702
parents:
diff changeset
7
83f997abf3b5 first commit
e155702
parents:
diff changeset
8 % Hoare Logic ベースで証明をすすめる〜みたいなとこをどっかにいれたい。
83f997abf3b5 first commit
e155702
parents:
diff changeset
9 % ↑ 上は Tree のコードが証明できないことを示して、その次の章に Hoare Logic でこ
83f997abf3b5 first commit
e155702
parents:
diff changeset
10 % んな感じにするとできるのでは?っていう感じにしよ
83f997abf3b5 first commit
e155702
parents:
diff changeset
11
83f997abf3b5 first commit
e155702
parents:
diff changeset
12 \section{Agda による Interface 部分を含めた Stack の部分的な証明}
83f997abf3b5 first commit
e155702
parents:
diff changeset
13 \label{src:agda-interface-stack}
83f997abf3b5 first commit
e155702
parents:
diff changeset
14
83f997abf3b5 first commit
e155702
parents:
diff changeset
15 % Stack の仕様記述
83f997abf3b5 first commit
e155702
parents:
diff changeset
16 ここでの証明とは Stack の処理が特定の性質を持つことを保証することである。
83f997abf3b5 first commit
e155702
parents:
diff changeset
17
83f997abf3b5 first commit
e155702
parents:
diff changeset
18 Stack の処理として様々な性質が存在する。例えば、
83f997abf3b5 first commit
e155702
parents:
diff changeset
19
83f997abf3b5 first commit
e155702
parents:
diff changeset
20 \begin{itemize}
83f997abf3b5 first commit
e155702
parents:
diff changeset
21 \item Stack に push した値は存在する
83f997abf3b5 first commit
e155702
parents:
diff changeset
22 \item Stack に push した値は取り出すことができる
83f997abf3b5 first commit
e155702
parents:
diff changeset
23 \item Stack に push した値を pop した時、その値は Stack から消える
83f997abf3b5 first commit
e155702
parents:
diff changeset
24 \item どのような状態の Stack に値を push しても中に入っているデータの順序は変わらない
83f997abf3b5 first commit
e155702
parents:
diff changeset
25 \item どのような状態の Stack でも、値を push した後 pop した値は直前に入れた値と一致する
83f997abf3b5 first commit
e155702
parents:
diff changeset
26 \end{itemize}
83f997abf3b5 first commit
e155702
parents:
diff changeset
27
83f997abf3b5 first commit
e155702
parents:
diff changeset
28 などの性質がある。
83f997abf3b5 first commit
e155702
parents:
diff changeset
29
83f997abf3b5 first commit
e155702
parents:
diff changeset
30 本セクションでは「どのような状態の Stack でも、値を push した後 pop した値は直前
83f997abf3b5 first commit
e155702
parents:
diff changeset
31 に入れた値と一致する」という性質を証明する。
83f997abf3b5 first commit
e155702
parents:
diff changeset
32
83f997abf3b5 first commit
e155702
parents:
diff changeset
33
83f997abf3b5 first commit
e155702
parents:
diff changeset
34 % この証明では任意の Stack に2回 push したあと2回 pop すると push したものと同じ
83f997abf3b5 first commit
e155702
parents:
diff changeset
35 % ものが受け取れることを 証明している。
83f997abf3b5 first commit
e155702
parents:
diff changeset
36
83f997abf3b5 first commit
e155702
parents:
diff changeset
37 まず始めに不定状態の Stack を定義する。ソースコード~\ref{src:agda-in-some-state}
83f997abf3b5 first commit
e155702
parents:
diff changeset
38 の stackInSomeState 型は中身の分からない抽象的な Stack を表現している。ソースコー
83f997abf3b5 first commit
e155702
parents:
diff changeset
39 ド~\ref{src:agda-in-some-state}の証明ではこのstackInSomeState に対して、 push を
83f997abf3b5 first commit
e155702
parents:
diff changeset
40 2回行い、 pop2 をして取れたデータは push したデータと同じものになることを証明してい
83f997abf3b5 first commit
e155702
parents:
diff changeset
41 る。
83f997abf3b5 first commit
e155702
parents:
diff changeset
42
83f997abf3b5 first commit
e155702
parents:
diff changeset
43 \lstinputlisting[label=src:agda-in-some-state, caption=抽象的なStackの定義とpush$->$push$->$pop2 の証明]{src/AgdaStackSomeState.agda.replaced}
83f997abf3b5 first commit
e155702
parents:
diff changeset
44
83f997abf3b5 first commit
e155702
parents:
diff changeset
45 % Agda でも継続を使った書き方で Interface 部分の実装を示した。
83f997abf3b5 first commit
e155702
parents:
diff changeset
46
83f997abf3b5 first commit
e155702
parents:
diff changeset
47 この証明では stackInSomeState 型の s が抽象的な Stack で、そこに x 、 y の2つのデー
83f997abf3b5 first commit
e155702
parents:
diff changeset
48 タを push している。また、 pop2 で取れたデータは y1 、 x1 となっていて両方が
83f997abf3b5 first commit
e155702
parents:
diff changeset
49 Just で返ってくるかつ、 x と x1 、 y と y1 がそれぞれ合同であることが仮定として
83f997abf3b5 first commit
e155702
parents:
diff changeset
50 型に書かれている。
83f997abf3b5 first commit
e155702
parents:
diff changeset
51
83f997abf3b5 first commit
e155702
parents:
diff changeset
52 % この辺ちょっと怪しい感じ
83f997abf3b5 first commit
e155702
parents:
diff changeset
53 この関数本体で返ってくる値は$ x \equiv x1 と y \equiv y1$ のため record でまと
83f997abf3b5 first commit
e155702
parents:
diff changeset
54 めて refl で推論が通る。
83f997abf3b5 first commit
e155702
parents:
diff changeset
55 これにより、抽象化した Stack に対して push 、 pop を行うと push したものと同じも
83f997abf3b5 first commit
e155702
parents:
diff changeset
56 のを受け取れることが証明できた。
83f997abf3b5 first commit
e155702
parents:
diff changeset
57
83f997abf3b5 first commit
e155702
parents:
diff changeset
58
83f997abf3b5 first commit
e155702
parents:
diff changeset
59 % \lstinputlisting[label=src:agda-Test, caption=]{src/AgdaStackTest.agda.replaced}
83f997abf3b5 first commit
e155702
parents:
diff changeset
60
83f997abf3b5 first commit
e155702
parents:
diff changeset
61 \section{Agda による Interface 部分を含めた Binary Tree の部分的な証明と課題}
83f997abf3b5 first commit
e155702
parents:
diff changeset
62 ここでは Binary Tree の性質の一部に対して証明を行う。
83f997abf3b5 first commit
e155702
parents:
diff changeset
63 Binary Tree の性質として挙げられるのは次のようなものである
83f997abf3b5 first commit
e155702
parents:
diff changeset
64 % 上の2つはデータ構造として最低限守られるべき部分ではあるがとりあえず書いてる
83f997abf3b5 first commit
e155702
parents:
diff changeset
65
83f997abf3b5 first commit
e155702
parents:
diff changeset
66 \begin{itemize}
83f997abf3b5 first commit
e155702
parents:
diff changeset
67 \item Tree に対して Node を Put することができる。
83f997abf3b5 first commit
e155702
parents:
diff changeset
68 \item Tree に Put された Node は Delete されるまでなくならない。
83f997abf3b5 first commit
e155702
parents:
diff changeset
69 \item Tree に 存在する Node とその子の関係は必ず「右の子 $>$ Node」かつ「Node $>$ 左の子」の関係になっている。
83f997abf3b5 first commit
e155702
parents:
diff changeset
70 \item どのような状態の Tree に値を put しても Node と子の関係は保たれる
83f997abf3b5 first commit
e155702
parents:
diff changeset
71 \item どのような状態の Tree でも値を Put した後、その値を Get すると値が取れる。
83f997abf3b5 first commit
e155702
parents:
diff changeset
72 \end{itemize}
83f997abf3b5 first commit
e155702
parents:
diff changeset
73
83f997abf3b5 first commit
e155702
parents:
diff changeset
74 ここで証明する性質は
83f997abf3b5 first commit
e155702
parents:
diff changeset
75
83f997abf3b5 first commit
e155702
parents:
diff changeset
76 ${!!}$ と書かれているところはまだ記述できていない部分で $?$ としている部分である。
83f997abf3b5 first commit
e155702
parents:
diff changeset
77
83f997abf3b5 first commit
e155702
parents:
diff changeset
78 \lstinputlisting[label=src:agda-tree-proof, caption=Tree Interface の証
83f997abf3b5 first commit
e155702
parents:
diff changeset
79 明]{src/AgdaTreeProof.agda.replaced}
83f997abf3b5 first commit
e155702
parents:
diff changeset
80
83f997abf3b5 first commit
e155702
parents:
diff changeset
81 この Tree の証明では、不定状態の Tree を redBlackInSomeState で作成し、その状態の Tree
83f997abf3b5 first commit
e155702
parents:
diff changeset
82 に一つ Node を Put し、その Node を Get することができるかを証明しようとしたもの
83f997abf3b5 first commit
e155702
parents:
diff changeset
83 である。
83f997abf3b5 first commit
e155702
parents:
diff changeset
84
83f997abf3b5 first commit
e155702
parents:
diff changeset
85 しかし、この証明は Node を取得する際に Put した Node が存在するか、 Get した
83f997abf3b5 first commit
e155702
parents:
diff changeset
86 Node が存在するのか、などの条件や、 Get した Node と Put した Node が合同なのか、
83f997abf3b5 first commit
e155702
parents:
diff changeset
87 key の値が等しい場合の eq は合同と同義であるのか等の様々な補題を証明する必要が
83f997abf3b5 first commit
e155702
parents:
diff changeset
88 あった。今回この証明では Put した Node と Get した
83f997abf3b5 first commit
e155702
parents:
diff changeset
89 Node が合同であることを記述しようとしていたがそれまでの計算が異なるため完全に合
83f997abf3b5 first commit
e155702
parents:
diff changeset
90 同であることを示すことが困難であった。
83f997abf3b5 first commit
e155702
parents:
diff changeset
91
83f997abf3b5 first commit
e155702
parents:
diff changeset
92 今後の研究では\ref{hoare-logic} で説明する Hoare Logic を元に証明を
83f997abf3b5 first commit
e155702
parents:
diff changeset
93 行おうと考えている。
83f997abf3b5 first commit
e155702
parents:
diff changeset
94
83f997abf3b5 first commit
e155702
parents:
diff changeset
95 \section{Hoare Logic}
83f997abf3b5 first commit
e155702
parents:
diff changeset
96 \label{hoare-logic}
83f997abf3b5 first commit
e155702
parents:
diff changeset
97
83f997abf3b5 first commit
e155702
parents:
diff changeset
98 Hoare Logic \cite{Hoare1969AnAB} とは Tony Hoare によって提案されたプログラム正
83f997abf3b5 first commit
e155702
parents:
diff changeset
99 しさを推論する手法である。図\ref{fig:hoare}のように、 P を前状態(Pre Condition)
83f997abf3b5 first commit
e155702
parents:
diff changeset
100 、C を処理(Command) 、 Q を後状態(Post Condition) とし、$\{P\} \ C \ \{Q\}$ のように考えたとき、
83f997abf3b5 first commit
e155702
parents:
diff changeset
101 プログラムの処理を「前状態を満たした後、処理を行い状態が後状態に変化する」といった形で考える事ができる。
83f997abf3b5 first commit
e155702
parents:
diff changeset
102
83f997abf3b5 first commit
e155702
parents:
diff changeset
103 \begin{figure}[htpb]
83f997abf3b5 first commit
e155702
parents:
diff changeset
104 \begin{center}
83f997abf3b5 first commit
e155702
parents:
diff changeset
105 \scalebox{0.6}[0.6]{\includegraphics{fig/hoare-logic.pdf}}
83f997abf3b5 first commit
e155702
parents:
diff changeset
106 \end{center}
83f997abf3b5 first commit
e155702
parents:
diff changeset
107 \caption{hoare logicの流れ}
83f997abf3b5 first commit
e155702
parents:
diff changeset
108 \label{fig:hoare}
83f997abf3b5 first commit
e155702
parents:
diff changeset
109 \end{figure}
83f997abf3b5 first commit
e155702
parents:
diff changeset
110
83f997abf3b5 first commit
e155702
parents:
diff changeset
111
83f997abf3b5 first commit
e155702
parents:
diff changeset
112 このとき、後状態から前状態を推論することができればそのプログラムは部分的に正しい
83f997abf3b5 first commit
e155702
parents:
diff changeset
113 動きをすることを証明することができる。
83f997abf3b5 first commit
e155702
parents:
diff changeset
114
83f997abf3b5 first commit
e155702
parents:
diff changeset
115 この Hoare Logic の前状態、処理、後状態を CodeGear、 input/output の DataGear が表
83f997abf3b5 first commit
e155702
parents:
diff changeset
116 \ref{fig:cbc-hoare} のように表せるのではないか考えている。
83f997abf3b5 first commit
e155702
parents:
diff changeset
117
83f997abf3b5 first commit
e155702
parents:
diff changeset
118 \begin{figure}[htpb]
83f997abf3b5 first commit
e155702
parents:
diff changeset
119 \begin{center}
83f997abf3b5 first commit
e155702
parents:
diff changeset
120 \scalebox{0.8}[0.8]{\includegraphics{fig/cbc-hoare.pdf}}
83f997abf3b5 first commit
e155702
parents:
diff changeset
121 \end{center}
83f997abf3b5 first commit
e155702
parents:
diff changeset
122 \caption{cbc と hoare logic}
83f997abf3b5 first commit
e155702
parents:
diff changeset
123 \label{fig:cbc-hoare}
83f997abf3b5 first commit
e155702
parents:
diff changeset
124 \end{figure}
83f997abf3b5 first commit
e155702
parents:
diff changeset
125
83f997abf3b5 first commit
e155702
parents:
diff changeset
126 この状態を当研究室で提案している CodeGear、 DataGear の単位で考えると
83f997abf3b5 first commit
e155702
parents:
diff changeset
127 Pre Condition が CodeGear に入力として与えられる Input DataGear、Command が
83f997abf3b5 first commit
e155702
parents:
diff changeset
128 CodeGear、 Post Condition を Output DataGear として当てはめることができると考えて
83f997abf3b5 first commit
e155702
parents:
diff changeset
129 いる。
83f997abf3b5 first commit
e155702
parents:
diff changeset
130
83f997abf3b5 first commit
e155702
parents:
diff changeset
131 今後の研究では CodeGear、 DataGear、継続の概念を Hoare Logic に当てはめ Agda に
83f997abf3b5 first commit
e155702
parents:
diff changeset
132 当てはめ、幾つかの実装を証明していく。
83f997abf3b5 first commit
e155702
parents:
diff changeset
133
83f997abf3b5 first commit
e155702
parents:
diff changeset
134 % Hoare Logic ではプログラムの動作が部分的に正しいことが証明できる。
83f997abf3b5 first commit
e155702
parents:
diff changeset
135 % 最終的な Stack、Tree の証明は Hoare Logic ベースで行う。
83f997abf3b5 first commit
e155702
parents:
diff changeset
136 %%
83f997abf3b5 first commit
e155702
parents:
diff changeset
137 % 部分正当性がプログラムに関する構造機能法によって合成的に証明できるという考えを導
83f997abf3b5 first commit
e155702
parents:
diff changeset
138 % 入した。
83f997abf3b5 first commit
e155702
parents:
diff changeset
139 %%