annotate final_pre/finalPre.tex @ 9:50a27cc71ca7

fix final_pre.
author ryokka
date Tue, 20 Feb 2018 17:33:21 +0900
parents c8bfe73b2faf
children 9af6c3636ea0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
1 \documentclass[twocolumn,twoside,9.5pt]{jarticle}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
2 \usepackage[dvipdfmx]{graphicx}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
3 \usepackage{picins}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
4 \usepackage{fancyhdr}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
5 %\pagestyle{fancy}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
6 \usepackage{abstract}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
7 \usepackage{url}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
8 \usepackage{bussproofs}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
9 \usepackage{listings,jlisting}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
10 \lhead{\parpic{\includegraphics[height=1zw,keepaspectratio,bb=0 0 251 246]{../pic/emblem-bitmap.pdf}}琉球大学主催 工学部情報工学科 中間発表予稿}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
11 \rhead{}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
12 \cfoot{}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
13
28f900230c26 add final_pre
ryokka
parents:
diff changeset
14 \setlength{\topmargin}{-1in \addtolength{\topmargin}{15mm}}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
15 \setlength{\headheight}{0mm}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
16 \setlength{\headsep}{5mm}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
17 \setlength{\oddsidemargin}{-1in \addtolength{\oddsidemargin}{11mm}}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
18 \setlength{\evensidemargin}{-1in \addtolength{\evensidemargin}{21mm}}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
19 \setlength{\textwidth}{181mm}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
20 \setlength{\textheight}{261mm}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
21 \setlength{\footskip}{0mm}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
22 \pagestyle{empty}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
23
28f900230c26 add final_pre
ryokka
parents:
diff changeset
24 \lstset{
28f900230c26 add final_pre
ryokka
parents:
diff changeset
25 frame=single,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
26 keepspaces=true,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
27 breaklines=true,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
28 xleftmargin=0zw,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
29 xrightmargin=0zw,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
30 framerule=.2pt,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
31 columns=[l]{fullflexible},
28f900230c26 add final_pre
ryokka
parents:
diff changeset
32 language={},
28f900230c26 add final_pre
ryokka
parents:
diff changeset
33 tabsize=4,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
34 lineskip=-0.5zw,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
35 escapechar={@},
28f900230c26 add final_pre
ryokka
parents:
diff changeset
36 }
28f900230c26 add final_pre
ryokka
parents:
diff changeset
37
28f900230c26 add final_pre
ryokka
parents:
diff changeset
38
28f900230c26 add final_pre
ryokka
parents:
diff changeset
39 \input{dummy.tex}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
40 \renewcommand{\abstractname}{Abstract}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
41 \begin{document}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
42
28f900230c26 add final_pre
ryokka
parents:
diff changeset
43 \title{Agda と継続を用いたプログラムの検証 \\ Verification of program using Agda and continuation}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
44 \author{145750B 氏名 {外間}{政尊} 指導教員 : 河野 真治}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
45 \date{}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
46 \twocolumn [
28f900230c26 add final_pre
ryokka
parents:
diff changeset
47 \maketitle
28f900230c26 add final_pre
ryokka
parents:
diff changeset
48 \begin{onecolabstract}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
49 % 高い信頼性を持つことは重要である。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
50 % 私たちはプログラムの信頼性を高めるためにCodeGear、DataGearという単位でプログラ
28f900230c26 add final_pre
ryokka
parents:
diff changeset
51 % ムを書くことを提案している。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
52 % そのためにCodeGear、DataGearという単位を使える言語 CbC を開発している。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
53 % CbC では既存の実装でのデータの取扱が複雑になっている。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
54 % そのためにDataGearとCodeGearを Interface という単位でまとめた。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
55 % これら単位をAgdaでも使えるようにし、CbC で記述した Stackや Tree を Agda に
28f900230c26 add final_pre
ryokka
parents:
diff changeset
56 % 変換した。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
57 % この論文ではそれらに対して幾つかの部分的な証明を試みた。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
58
28f900230c26 add final_pre
ryokka
parents:
diff changeset
59 Program has high reliability. it is important.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
60 we are proposing to write program in units of CodeGear, DataGear for increase
28f900230c26 add final_pre
ryokka
parents:
diff changeset
61 the reliability.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
62 we are deceloping Continuation based C (CbC) that can use units CodeGear and
28f900230c26 add final_pre
ryokka
parents:
diff changeset
63 DataGear.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
64 In CbC, the handling of data in existing implementations is complicated.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
65 for that purpose, we can provide a interface mechanisms which are packages of
28f900230c26 add final_pre
ryokka
parents:
diff changeset
66 CodeGears and DataGears.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
67 we made these units and interface available for Agda.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
68 Also converted Stack and Tree wrote in CbC to Agda.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
69 In this papaer, we tried several proofs on them.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
70 %
28f900230c26 add final_pre
ryokka
parents:
diff changeset
71 % (we are mapping this units to Agda)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
72 % CbC では CodeGear 、 DataGear という単位でプログラミングできる。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
73 % ~~
28f900230c26 add final_pre
ryokka
parents:
diff changeset
74 % Agda で interface を実装
28f900230c26 add final_pre
ryokka
parents:
diff changeset
75 % interface を含めて証明ができるか
28f900230c26 add final_pre
ryokka
parents:
diff changeset
76 % codeとcode のあいだをcall ではなくjmpで結ぶことができる(goto)
28f900230c26 add final_pre
ryokka
parents:
diff changeset
77 %gotoをつかうことによりOSに必須なmeta計算を実現できる
28f900230c26 add final_pre
ryokka
parents:
diff changeset
78 %メタ計算は例えばメモリ管理スレッド管理CPUやGPUの資源管理そしてData/Code Gear の管理などである
28f900230c26 add final_pre
ryokka
parents:
diff changeset
79 %metaレベルではcode/data gear は一つの塊として操作される。これをcbcではunion dataとして実装している
28f900230c26 add final_pre
ryokka
parents:
diff changeset
80 %code gear 間の接続はつぎのcode gearの番号とthread structure に相当するcontextをmeta code gear にgoto する
28f900230c26 add final_pre
ryokka
parents:
diff changeset
81 %meta code gear で os の 機能であるメモリ管理やスレッド管理を行う。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
82 %ユーザーレベルではmeta構造を直接見ることはなく、継続を用いた関数型プログラミングに見える
28f900230c26 add final_pre
ryokka
parents:
diff changeset
83 %metaレベルから見たdata gearをゆーざーれべるのcode gearに接続するにはstub というmeta code gear を用いる
28f900230c26 add final_pre
ryokka
parents:
diff changeset
84 %stubとmetaはユーザーレベルcodegear とdatagearから生成することができる
28f900230c26 add final_pre
ryokka
parents:
diff changeset
85 %本論文ではstub とcontext 管理構造を生成するスクリプトを作成した
28f900230c26 add final_pre
ryokka
parents:
diff changeset
86 %これによりcode gear とdeta gear をデータを操作するinterface というまとまりにすることができる。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
87 % CbC gives Code Gear and Data Gear as programing units.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
88 % A transfer from a Code Gear to another Code Gear is implemented using a CbC's goto statement,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
89 % which is compiled as a jump instruction in CbC.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
90 % CbC's goto statements provides a ways of implementing meta computations.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
91 % From a view point of meta computation, Data Gear or Code Gear are uniform data units, which are implemented
28f900230c26 add final_pre
ryokka
parents:
diff changeset
92 % as union Data in CbC.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
93 % In the meta level, a transfer from a Code Gear is a goto statement to meta Code Gear with next Code Gear number and
28f900230c26 add final_pre
ryokka
parents:
diff changeset
94 % a Context which corresponds thread structure or an environments in a functional programing.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
95 % From a normal level, meta structures are not visible directly and a Code Gear looks like a function using continuations.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
96 % A stub Code Gear is used as a bridge between meta level and normal level.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
97 % we can generate meta Code Gear and stub Code Gear from normal level Code Gear,
28f900230c26 add final_pre
ryokka
parents:
diff changeset
98 % and provide a interface mechanisms which are packages of Code Gears and Data Gears.
28f900230c26 add final_pre
ryokka
parents:
diff changeset
99 \end{onecolabstract}]
28f900230c26 add final_pre
ryokka
parents:
diff changeset
100 \thispagestyle{fancy}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
101
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
102 % ソフトウェアの信頼性の保証
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
103 %   CbC の話(CG,DGの話も)
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
104 %   メタ計算を分けてる
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
105 % context (Meta DataGear)
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
106 % そのために interface
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
107 % Agda でも interfece を実装して検証した
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
108
28f900230c26 add final_pre
ryokka
parents:
diff changeset
109 \section{ソフトウェアの信頼性の保証}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
110 ソフトウェアの信頼性を保証することは重要である。現在ソフトウェアの信頼性を保証す
28f900230c26 add final_pre
ryokka
parents:
diff changeset
111 る方法として代表的なものはモデル検査と、定理証明が存在している。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
112 当研究室では検証しやすいプログラムの単位として、 CodeGear と DataGear という単位
28f900230c26 add final_pre
ryokka
parents:
diff changeset
113 を用いるプログラミングスタイルを提案している。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
114 また、 CodeGear 、 DataGear という単位を用いてプログラミングする言語として
28f900230c26 add final_pre
ryokka
parents:
diff changeset
115 Countinuation based C (以下 CbC) を開発している。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
116 % 本研究では、検証や証明に直接使用できる言語として CbC を用いる。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
117
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
118 CbC では通常の計算とメタ計算を分けて記述している。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
119 しかし、CodeGear で DataGear を扱う際、 Context と呼ばれる CodeGear、 DataGear の
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
120 リスト等を持っている Meta DataGear を経由する。
9
50a27cc71ca7 fix final_pre.
ryokka
parents: 8
diff changeset
121 通常の CodeGear から Meta DataGear である Context を直接扱えると、ユーザーがメタ
50a27cc71ca7 fix final_pre.
ryokka
parents: 8
diff changeset
122 計算をノーマルレベルで自由に記述できてしまい、信頼性を損なう。そのため、 CbC
50a27cc71ca7 fix final_pre.
ryokka
parents: 8
diff changeset
123 では Context を通して、次の CodeGear に接続する Meta CodeGear である stub
50a27cc71ca7 fix final_pre.
ryokka
parents: 8
diff changeset
124 CodeGear を定義している。
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
125
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
126 CbC で実装していくにつれて特殊な stub CodeGear の記述が複雑になった。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
127 そこで既存の実装をモジュールとして扱うために Interface という仕組みを導入した。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
128 Interface では、DataGear に対しての操作(API)を CodeGear とその CodeGear で扱われ
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
129 ている DataGearの集合を抽象的に表現した Meta DataGear として定義されている。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
130
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
131 本研究では CbCで使われている Interface を 、 Agda 上で定義、実装を行い、
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
132 Interface を含めた Stack と Tree の部分的な証明を行なった。
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
133
28f900230c26 add final_pre
ryokka
parents:
diff changeset
134 \section{Countinuation based C (CbC)}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
135 Continuation based C (CbC) とは、当研究室で開発されているプログラミング言語である。
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
136 CbC は C 言語とほぼおなじ構文を持つが、 C の関数の代わりに CodeGear を用いて処理
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
137 を記述する。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
138 CodeGear は関数定義の先頭に $\_\_code$ をつけて定義する。
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
139 CodeGear は処理の単位でそれらの状態を goto で遷移して記述する。この goto による処理の遷移を継続と呼ぶ。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
140 DataGear は CodeGear が扱うデータの単位であり、処理に必要なデータが全て入っている。次の CodeGear に処理を移す際は、 goto の後に CodeGear 名と DataGear を指定する。
9
50a27cc71ca7 fix final_pre.
ryokka
parents: 8
diff changeset
141 CbC ではこの継続処理がメタ計算として定義されており、通常計算である CodeGear を変
50a27cc71ca7 fix final_pre.
ryokka
parents: 8
diff changeset
142 更することなく検証や資源管理等の記述を行うことができる。
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
143 例として CbC の簡単な例(ソースコード\ref{src:goto})と、流れ\ref{fig:code_simple}を示す。
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
144
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
145 \lstinputlisting[label=src:goto, caption=CbCコードの例]{./src/goto.cbc}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
146 \begin{figure}[htpb]
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
147 \begin{center}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
148 \scalebox{0.7}[0.7]{\includegraphics{fig/codesegment.pdf}}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
149 \end{center}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
150 \caption{ソースコード\ref{src:goto}の流れ}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
151 \label{fig:code_simple}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
152 \end{figure}
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
153
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
154 ソースコード\ref{src:goto}では cs0、 cs1 が CodeGear で a+b が cs0 の Output DataGear であり、
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
155 cs1 の Input DataGear になる。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
156 流れ\ref{fig:code_simple}は cs0 から cs1 へ継続した後、 cs0 には戻らずに次の継
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
157 続に指定された CodeGear へ継続する。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
158
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
159 \section{CbC における Interface の定義}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
160 CbC で実装していくにつれ、stub CodeGear の記述が煩雑になった。
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
161 そのため 既存の実装を モジュールとして扱うため Interface を導入した。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
162 Interface は DataGear に対して何らかの操作(API)を行う CodeGear とその
28f900230c26 add final_pre
ryokka
parents:
diff changeset
163 CodeGear で使われる DataGear の集合を抽象化した メタレベルの DataGear
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
164 として定義した。例として Stack での Interface の実装(ソースコード\ref{src:interface})を示す。
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
165
28f900230c26 add final_pre
ryokka
parents:
diff changeset
166 \lstinputlisting[label=src:interface, caption=CbCでのStack-Interfaceの実装] {src/singleLinkedStackInterface.cbc}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
167
28f900230c26 add final_pre
ryokka
parents:
diff changeset
168 元の実装の push では Stack を指定する必要があるが、
28f900230c26 add final_pre
ryokka
parents:
diff changeset
169 Interface での実装は push 先の Stack が stackImpl として扱
28f900230c26 add final_pre
ryokka
parents:
diff changeset
170 われている。この stackImpl は呼ばれた時の Stack と同じになる。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
171 これにより、 ユーザーは実行時に Stack を指定する必要がなくなる。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
172 このように Interface 記述をすることで CbC で通常記述する必要がある一定の部分を省略し呼び出
28f900230c26 add final_pre
ryokka
parents:
diff changeset
173 しが容易になる。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
174
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
175 \section{Agda}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
176 Agda\cite{agda} とは定理証明支援器であり依存型を関数プログラミング言語である。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
177 依存型とは型も第一級オブジェクトとする型システムであり、型の型や型を引数に取る関数、値を取って型を返す関数などが記述することができる。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
178 CbC を Agda に変換する場合 DataGear はレコード型、 CodeGear は Agda での通常関数
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
179 として定義できる。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
180 前項で示した CbC の簡単な例を Agda に変換する。(ソースコード\ref{src:agda-css})
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
181
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
182 \lstinputlisting[label=src:agda-css, caption= Agda における CodeSegment の定義]
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
183 {src/CodeSegments.agda}
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
184
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
185 Agda のコードで関数を定義するときは関数名、型を記述した後に関数本体を指定する。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
186 関数の型では → または \verb/->/ を使い定義し、関数本体は関数名の後に$=$をつけて
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
187 記述する。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
188 DataGear はレコード型で表記できるため Agda 上で DataGear を定義することが可能で
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
189 ある。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
190 % 定義をする際は record キーワードのあとにレコード名、
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
191 % 型、 where の後に field キーワードを入れ、フィールド名 : 型名 と列挙する。レコー
28f900230c26 add final_pre
ryokka
parents:
diff changeset
192 % ドを構築する際は record キーワードの後に {} 内部に fileName = value の形で列挙
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
193 % していく。複数の値を列挙する際は ; で区切る。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
194 % Agda での DataGear の定義の例を以下のソースコード\ref{src:agda-ds}示す
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
195 % \lstinputlisting[label=src:agda-ds, caption=Agda における DataSegment の定義] {src/DataSegment.agda}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
196 このように CbC のコードを Agda に変換し、証明を行う。
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
197
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
198 \section{Agda における Interface の定義、実装}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
199 Agda でも CbC と同様に Interface の定義、実装した。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
200 例として Agda で実装した Stack-interface の一部をみる。
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
201 Stack の定義はソースコード\ref{src:agda-interface}、実装は ソースコード
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
202 \ref{src:agda-single-linked-stack}
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
203 として書かれている。それを Stack 側から interface を通して呼び出している。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
204
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
205 \lstinputlisting[label=src:agda-interface, caption=Agda における Stack
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
206 -Interface の定義の一部] {src/AgdaInterface.agda}
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
207
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
208 \lstinputlisting[label=src:agda-single-linked-stack, caption=Agda における Stack
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
209 -Interface の実装の一部] {src/AgdaSingleLinkedStack.agda}
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
210
28f900230c26 add final_pre
ryokka
parents:
diff changeset
211 \section{Agda による Interface 部分を含めた Stack の部分的な証明}
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
212 今回は Interface を通した Stack で push
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
213 、 pop などの操作が正しく行われるかの証明を行った。
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
214 ここでの証明とは Stack が特定の性質を持つことを保証することである。
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
215
28f900230c26 add final_pre
ryokka
parents:
diff changeset
216 Stack の処理として様々な性質が存在するが、ここでは
28f900230c26 add final_pre
ryokka
parents:
diff changeset
217 「どのような状態の Stack でも、値を push した後 pop した値は直前
28f900230c26 add final_pre
ryokka
parents:
diff changeset
218 に入れた値と一致する」という性質を証明した。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
219
28f900230c26 add final_pre
ryokka
parents:
diff changeset
220 まず始めに不定状態の Stack をソースコード~\ref{src:agda-in-some-state}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
221 で定義した。 stackInSomeState が不定状態の Stack である。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
222 ソースコード~\ref{src:agda-in-some-state}の証明ではこのstackInSomeState に対し
28f900230c26 add final_pre
ryokka
parents:
diff changeset
223 て、 push を2回行い、 pop2 をして取れたデータは push したデータと同じものになる
28f900230c26 add final_pre
ryokka
parents:
diff changeset
224 ことの証明している。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
225
28f900230c26 add final_pre
ryokka
parents:
diff changeset
226 \lstinputlisting[label=src:agda-in-some-state, caption=抽象的なStackの定義とpush$->$push$->$pop2 の証明]{src/AgdaStackSomeState.agda}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
227
28f900230c26 add final_pre
ryokka
parents:
diff changeset
228 stackInSomeState 型の s が抽象的な Stack で、そこに x 、 y の2つのデー
28f900230c26 add final_pre
ryokka
parents:
diff changeset
229 タを push している。また、 pop2 で取れたデータは y1 、 x1 となっていて両方が
28f900230c26 add final_pre
ryokka
parents:
diff changeset
230 Just で返ってくるかつ、 x と x1 、 y と y1 がそれぞれ合同であることが仮定として
28f900230c26 add final_pre
ryokka
parents:
diff changeset
231 型に書いた。関数本体で返る値は$ x \equiv x1 と y \equiv y1$で両方共に成り立つ為、
28f900230c26 add final_pre
ryokka
parents:
diff changeset
232 refl で推論が通る。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
233 これにより、抽象化した Stack に対して push を2回行い、 pop を行うと push したものと同じも
28f900230c26 add final_pre
ryokka
parents:
diff changeset
234 のを受け取れることが証明できた。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
235
28f900230c26 add final_pre
ryokka
parents:
diff changeset
236 \section{まとめ}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
237 本研究では CodeGear、 DataGear を用いたプログラミング手法を用いて、Agda で
28f900230c26 add final_pre
ryokka
parents:
diff changeset
238 Interface を用いたプログラムを実装、検証した。
28f900230c26 add final_pre
ryokka
parents:
diff changeset
239 また、 CbC で記述した時には細かく分かっていなかった Interface の型が明確に
28f900230c26 add final_pre
ryokka
parents:
diff changeset
240 なった。
8
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
241 今後の課題としては、Tree 側では証明が複雑化し、うまく証明できていないことと、
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
242 Hoare Logic 用いての証明を行えるように、CodeGear、DataGear をベースにした Hoare
c8bfe73b2faf fix final_pre
ryokka
parents: 7
diff changeset
243 Logic を Agda 上で定義し、実際に証明を行うことなどが挙げられる。
7
28f900230c26 add final_pre
ryokka
parents:
diff changeset
244
28f900230c26 add final_pre
ryokka
parents:
diff changeset
245 \nocite{*}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
246 \bibliographystyle{junsrt}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
247 \bibliography{reference}
28f900230c26 add final_pre
ryokka
parents:
diff changeset
248 \end{document}