annotate Paper/tex/tree_desc.tex @ 6:9ec2d2ac1309

DONE 一度これで提出
author soto <soto@cr.ie.u-ryukyu.ac.jp>
date Thu, 05 May 2022 22:32:45 +0900
parents 14a0e409d574
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 \section{Gears Agda における木構造の設計}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
3 本研究では,Gears Agda にて Red Black Tree の検証を行うにあたり,
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
4 Agda が変数に対して再代入を許していないことが問題になってくる.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
6 そのため下図 \ref{rbt-stack} のように,木構造の root から leaf に 辿る際に見ているnodeから
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
7 下の tree をそのまま stack に持つようにする.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
9 そして insert や delete を行った後に stack から tree を取り出し,
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
10 元の木構造を再構築 していきながら rootへ戻る.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 \begin{figure}[H]
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 \begin{center}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 \includegraphics[height=3.5cm]{fig/rbt-stack.pdf}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 \end{center}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 \caption{tree を stack して目的の node まで辿った場合の例}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 \label{rbt-stack}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 \end{figure}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
20
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
21 このようにして Gears Agda にて Red Black Tree を実装していく.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
23 \section{Gears Agda における Binary Tree の実装}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
24
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
25 Red Black Tree を実装しそれを検証する前段階として,
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
26 実装が簡単な Binary Tree の実装から行う.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
28 まず Binary Tree と 遷移させる Data Gear となる Env の定義は Code \ref{bt_env} のようになる.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 \lstinputlisting[label=bt_env, caption=Binary Tree の Data Gear] {src/bt_impl/bt_env.agda.replaced}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
32 bt は,木での順序としての意味を持つ key とその中身 value はどのような型でも入れられるように
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
33 「A : Set n」となっている.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
34 そして left, right には bt A を持つようにし,木構造を構築している.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
36 Env では, find, insert, delete の対象となる値を保存し, Code Gear に与えられるようにするために
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
37 varn, varv を持っている.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
38 加えて変更を加える bt を持つ vart と,章Nで前述した木構造を持っておくための List である
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
39 varl を Env に設定している.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 7章で述べた Gears Agda での木構造を保ったまま root から目的のnodeまで辿る Code Gear が
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
42 Code \ref{bt_find_impl} になる.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
43
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 \lstinputlisting[label=bt_find_impl, caption=root から目的のnodeまで辿る Code Gear] {src/bt_impl/find.agda.replaced}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
46 まず,関数の実装が始まってすぐに Env の vartを指定したものと引数をそのまま find-c の関数に遷移している.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
47 ここで展開しているのは Env の vart で,そのまま Env から展開した vart をパターンマッチすると
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
48 Agda が追えなくなってしまい,\{-$\#$ TERMINATING $\#$-\} を使用することになってしまう.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
50 そのため関数を新たに定義し,展開したものを受け取り,パターンマッチすることで
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 \{-$\#$ TERMINATING $\#$-\} を使用せずに loopを定義できるようになる
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
52
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
53 木を stack に入れるのは単純で,操作の対象の key となる varn と
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
54 node のkeyを比較を行う.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
55 そこからは本来の木構造と同じで,操作の対象の key が小さいなら
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
56 left の tree を次の node として遷移する.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
57 大きいなら right の tree を次の node として遷移していく.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
59 操作の対象となる node に辿り着き,操作を行った後,
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
60 Stack に持っている tree から再構築を行う.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62 そのコードが Code \ref{bt_replace_impl} となる
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
63
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 \lstinputlisting[label=bt_replace_impl, caption=Stack から tree を再構築する Code Gear] {src/bt_impl/replace.agda.replaced}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
66 これも Code \ref{bt_find_impl} と同じように構成されており,
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
67 varn と node の key を比較し, vart を List から持ってきた node の どこに加えるかを決めるようになっている.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
69 以上の流れを繋げることで, Binary Tree の insert と find を実装できた.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
70 delete は insert の値を消すようにすると実装ができる.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 \section{Gears Agda における Binary Tree の検証}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
74 検証も前述した While Loop の 検証と同じようにしていく.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
75 しかし, Binary Tree の不変条件は2つ以上あるため,これを関数定義の際に全て書くと
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
76 煩雑になってしまうため,事前に記述して関数化しておく.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
77 それが Code \ref{bt_invariant} になる.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 \lstinputlisting[label=bt_invariant, caption=Binary Tree の 不変条件] {src/bt_verif/invariant.agda.replaced}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
81 この不変条件は, treeInvariant が tree の 左にある node の key が小さく,
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
82 右にある node の方が大きいことを条件としている.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
84 stackInvariant は Stack にある tree が,次に取り出す Tree の一部であることを
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
85 条件としている.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
86
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
87 これを先ほど実装した Code Gear に対して加えることで検証していく.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
88 先ほど実装した Code \ref{bt_find_impl} に対して加えると Code ref のようになる.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
89
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
90
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 \lstinputlisting[label=bt_invariant, caption=Binary Tree の 不変条件] {src/bt_verif/find.agda.replaced}
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 現時点では条件を満たしていることの証明まで行っていないが
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
94 コード中の {!!} に記述を行い,前述した While Loop と同じように中身を記述することで検証を行える.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 \section{まとめと今後の課題}
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
97 本論文では,Gears Agda にて Hoare Logic を用いて While Loop の検証を行えた.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
98 これはプログラムが Code Gear という単位で分かれているため,
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
99 一つ一つの Code Gear に対して検証を行いながら実装を行っていくことも可能である.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
100 そのため,従来の検証手法よりもスコープが小さく,簡単に検証と実装を行えると考える.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
6
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
102 今後の課題として,Gears Agda による Red Black Tree の実装と検証を行う必要がある.
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
103 While Loop と同じように検証を行えると考えているが,研究目的である
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
104 「ループが存在し,かつ再代入がプログラムに含まれるデータ構造」を
9ec2d2ac1309 DONE 一度これで提出
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
105 Gaers Agda を実装することが難しく,それをさらに検証しなければならない.
0
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
106
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
107
14a0e409d574 ADD fast commit
soto <soto@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
108