comparison presentation/slide.md @ 120:8a84cda440f3

Update slide
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Tue, 14 Feb 2017 11:31:08 +0900
parents 26563097333c
children 137aae675a94
comparison
equal deleted inserted replaced
119:26563097333c 120:8a84cda440f3
19 * 依存型を持つ証明支援系言語 Agda による CbC の証明 19 * 依存型を持つ証明支援系言語 Agda による CbC の証明
20 * 部分型を利用して Agda 上に型付きの CbC の項を記述する 20 * 部分型を利用して Agda 上に型付きの CbC の項を記述する
21 * 型システムを通して CbC の形式的な定義を得る 21 * 型システムを通して CbC の形式的な定義を得る
22 * SingleLinkedStack の性質の証明 22 * SingleLinkedStack の性質の証明
23 23
24 # 本発表ではモデル検査的アプローチについて中心に見ていきます
25 * 修士論文の内部の比率は半分半分くらい
26 * 定理証明の方は説明する内容が多くて複雑
27 * モデル検査的アプローチは過去論文を提出したもの
28 * なのでそちらをメインで発表します
29
24 # モデル検査的アプローチについての流れ 30 # モデル検査的アプローチについての流れ
25 * Continuation based C (CbC) 言語について 31 * Continuation based C (CbC) 言語について
26 * CbC における CodeSegment と DataSegment を用いたプログラミングスタイル 32 * CbC における CodeSegment と DataSegment を用いたプログラミングスタイル
27 * CbC とメタ計算について 33 * CbC とメタ計算について
28 * CbC で記述された GearsOS とそのデータ構造である赤黒木 34 * CbC で記述された GearsOS とそのデータ構造である赤黒木
35 * CodeSegment と DataSegment という単位を用いてプログラミングする 41 * CodeSegment と DataSegment という単位を用いてプログラミングする
36 * 両検証手法をメタ計算として利用可能 42 * 両検証手法をメタ計算として利用可能
37 43
38 # CodeSegment 44 # CodeSegment
39 * CodeSegment とは 45 * CodeSegment とは
40 * 処理の単位 46 * 処理の単位であり、入力と出力を持つ
41 * 結合や分割が容易 47 * 結合や分割が容易
42 * 入力と出力を持つ
43 * CodeSegment どうしを接続することによりプログラム全体を作る 48 * CodeSegment どうしを接続することによりプログラム全体を作る
49 * 関数呼び出しと違って戻ってこない(goto)
44 50
45 ![cs](./images/cs.svg){:width="50%"} 51 ![cs](./images/cs.svg){:width="50%"}
52
53 ```
54 __code cs0(int a, int b){
55 goto cs1(a+b);
56 }
57 ```
46 58
47 59
48 # DataSegment 60 # DataSegment
49 * DataSegment とは 61 * DataSegment とは
50 * データの単位 62 * データの単位
51 * CodeSegment の入出力にあたる 63 * CodeSegment の入出力にあたる
52 * 接続元の Output DataSegment は接続先の Input DataSegment 64 * 接続元の Output DataSegment は接続先の Input DataSegment
53 65
54 ![ds](./images/ds.svg){:width="50%"} 66 ![ds](./images/ds.svg){:width="50%"}
67
68 ```
69 __code cs0(int a, int b){
70 goto cs1(a+b);
71 }
72 ```
55 73
56 # メタ計算 74 # メタ計算
57 * とある計算を実現するための計算 75 * とある計算を実現するための計算
58 * ネットワーク接続、例外処理、メモリ確保、並列処理など 76 * ネットワーク接続、例外処理、メモリ確保、並列処理など
59 * CbC は通常レベルの計算とメタ計算を分離して考える 77 * CbC は通常レベルの計算とメタ計算を分離して考える
85 * 特に赤黒木はノードが持つ赤か黒の色を使って木のバランスを取る 103 * 特に赤黒木はノードが持つ赤か黒の色を使って木のバランスを取る
86 * ルートノードと葉ノードの色は黒 104 * ルートノードと葉ノードの色は黒
87 * 赤ノードは2つの黒ノードを子として持つ(よって赤ノードが続くことは無い) 105 * 赤ノードは2つの黒ノードを子として持つ(よって赤ノードが続くことは無い)
88 * ルートから最下位ノードへの経路に含まれる黒ノードの数はどの最下位ノードでも一定 106 * ルートから最下位ノードへの経路に含まれる黒ノードの数はどの最下位ノードでも一定
89 107
90 ![rbtree](./images/rbtree.svg){:width="50%"} 108 ![rbtree](./images/rbtree.svg){:width="35%"}
91 109
92 # GearsOS における赤黒木の利用例(ノードの挿入) 110 # GearsOS における赤黒木の利用例(ノードの挿入)
93 * 挿入したい要素を DataSegment に格納して次の CodeSegment へ goto 111 * 挿入したい要素を DataSegment に格納して次の CodeSegment へ goto
94 * goto する前に Meta CodeSegment が実行されて木に挿入する 112 * goto する前に Meta CodeSegment が実行されて木に挿入する
95 * GearsOS では木の実装のためにスタックを用いて経路情報を保持している 113 * GearsOS では木の実装のためにスタックを用いて経路情報を保持している
96 114
115
97 ![put](./images/put.svg){:width="50%"} 116 ![put](./images/put.svg){:width="50%"}
117
118 ```
119 goto meta(context, Put);
120 ```
98 121
99 # 仕様の記述とその確認 122 # 仕様の記述とその確認
100 * 「バランスが取れている」とは何かを表現できる必要がある 123 * 「バランスが取れている」とは何かを表現できる必要がある
101 * 実行可能な CbC の式を使った assert になる 124 * 実行可能な CbC の式を使った assert になる
102 * そしてそれを保証したい 125 * そしてそれを保証したい
108 * 並列に動作するプログラムの仕様を検証可能 131 * 並列に動作するプログラムの仕様を検証可能
109 * 検証した promela から実行可能な C ソースを生成可能 132 * 検証した promela から実行可能な C ソースを生成可能
110 * 仕様は bool になる式を用いた assert 133 * 仕様は bool になる式を用いた assert
111 * デメリット: promela は C とは記述が異なる 134 * デメリット: promela は C とは記述が異なる
112 135
136 ```
137 assert(x < 10);
138 ```
139
113 # 既存のモデル検査器 CBMC 140 # 既存のモデル検査器 CBMC
114 * CBMC 141 * CBMC
115 * 検証対象のCソースを変更しないでも良い 142 * 検証対象のCソースを変更しないでも良い
116 * C/C++ 言語の記号実行が可能 143 * C/C++ 言語の記号実行が可能
117 * 条件分岐を網羅的に実行 144 * 条件分岐を網羅的に実行
118 * 仕様は bool になる式を用いた assert 145 * 仕様は bool になる式を用いた assert
119 * 有限ステップ検証する有界モデル検査器 146 * 有限ステップ検証する有界モデル検査器
120 147
121 # メタ計算ライブラリ akasha 148 ```
122 * メタ計算としてプログラムの状態を数え上げる 149 assert(x < 10);
123 * goto された時に挿入される要素の組み合わせを全て列挙して実行する 150 ```
124 * その度に仕様の式は成り立つかをチェックする
125 * ノーマルレベルのコードを検証用に変更せず検証可能
126
127 ![akashaPut](./images/akashaPut.svg){:width="51%"}
128 151
129 # チェックする仕様 152 # チェックする仕様
130 * 赤黒木の高さに関する仕様に以下のものがある 153 * 赤黒木の高さに関する仕様に以下のものがある
131 * 木をルートから辿った際に最も長い経路は最も短い経路の高々2倍に収まる 154 * 木をルートから辿った際に最も長い経路は最も短い経路の高々2倍に収まる
132 * 以下のように assert を用いて CbC で定義できる 155 * 以下のような条件式を仕様として CbC で定義、検証できる
133 * この仕様が満たされるかをチェックする
134 156
135 ``` 157 ```
136 __code verifySpecificationFinish(struct Context* context) { 158 __code verifySpecificationFinish(struct Context* context) {
137 if (context->data[AkashaInfo]->akashaInfo.maxHeight > 159 if (context->data[AkashaInfo]->akashaInfo.maxHeight >
138 2*context->data[AkashaInfo]->akashaInfo.minHeight) 160 2*context->data[AkashaInfo]->akashaInfo.minHeight)
141 goto meta(context, ShowTrace); 163 goto meta(context, ShowTrace);
142 } 164 }
143 goto meta(context, DuplicateIterator); 165 goto meta(context, DuplicateIterator);
144 } 166 }
145 ``` 167 ```
168
169 # メタ計算ライブラリ akasha
170 * メタ計算としてプログラムの状態を数え上げる
171 * goto された時に挿入される要素の組み合わせを全て列挙して実行する
172 * 赤黒木の状態の保存、挿入、チェック、次の状態の列挙、赤黒木の再現……
173 * その度に仕様の式は成り立つかをチェックする
174 * ノーマルレベルのコードを検証用に変更せず検証可能
175
176 ![akashaPut](./images/akashaPut.svg){:width="51%"}
146 177
147 # akasha と CBMC の比較 178 # akasha と CBMC の比較
148 * akasha は有限の要素数の組み合わせをチェックする 179 * akasha は有限の要素数の組み合わせをチェックする
149 * 要素数が13個までならどの順で木に挿入しても良い 180 * 要素数が13個までならどの順で木に挿入しても良い
150 * 比較対象として C Bounded Model Checker を使用した 181 * 比較対象として C Bounded Model Checker を使用した
152 * 実行可能なステップ数411だけ展開しても仕様は満たされる 183 * 実行可能なステップ数411だけ展開しても仕様は満たされる
153 * が、恣意的にバグを入れ込んでも反例を返さない 184 * が、恣意的にバグを入れ込んでも反例を返さない
154 * akasha は返した 185 * akasha は返した
155 * 固定の要素数までの仕様検査で十分なのか? 186 * 固定の要素数までの仕様検査で十分なのか?
156 187
157 # 定理証明的なアプローチの流れ
158 * プログラムを証明するにはどうするのか
159 * 証明支援系 Agda における証明
160 * Agda による CbC の定義
161 * Agda を用いて CbC のコードを証明する
162
163 # 定理証明を Continuation based C へ適用するには 188 # 定理証明を Continuation based C へ適用するには
164 * 任意の回数だけ木の操作を行なっても大丈夫なことを保証したい 189 * 任意の回数だけ木の操作を行なっても大丈夫なことを保証したい
165 * そのままプログラムの性質を保証してやる 190 * そのままプログラムの性質を保証してやる
166 * Coq, Agda, ATS2 などのプログラミング言語で証明が可能 191 * Coq, Agda, ATS2 などのプログラミング言語で証明が可能
167 * 本当は CbC で CbC 自身を証明したい 192 * 本当は CbC で CbC 自身を証明したい
204 * 任意の通常のレベルの計算を扱えなくてはならない 229 * 任意の通常のレベルの計算を扱えなくてはならない
205 * ライブラリが呼び出されるプログラムは無数にあるようなイメージ 230 * ライブラリが呼び出されるプログラムは無数にあるようなイメージ
206 * メタレベルを使うための制約を満たしていれば良い、ということを表現できれば良い 231 * メタレベルを使うための制約を満たしていれば良い、ということを表現できれば良い
207 * 部分型を使う 232 * 部分型を使う
208 * Java におけるインターフェース、Haskell における型クラス 233 * Java におけるインターフェース、Haskell における型クラス
209 * 「このデータにはこのフィールドさえあれば良い」 234 * 「このフィールドXがあればデータ型Tとみなして良い」
210 235
211 # Agda 上のメタ計算 236 # Agda 上のメタ計算
212 * ノーマルレベルの型を保持したままメタレベルの計算を利用できる 237 * ノーマルレベルの型を保持したままメタレベルの計算を利用できる
213 * cs0 の定義はメタ計算用に変更しなくても良い 238 * cs0 の定義はメタ計算用に変更しなくても良い
214 239
215 ``` 240 ```
241 cs0 : CodeSegment ds0 ds1
242 cs0 = cs (\d -> goto cs1 (record {c = (ds0.a d) + (ds0.b d)}))
243 ```
244
245 ```
216 main : ds1 246 main : ds1
217 main = goto cs0 (record {a = 100 ; b = 50}) 247 main = goto cs0 (record {a = 100 ; b = 50})
218 ``` 248 ```
219 ``` 249 ```
220 main : Meta 250 main : Meta
221 main = gotoMeta push cs0 (record {context = (record {a = 100 ; b = 50 ; c = 70}) ; c' = 0 ; next = (N.cs id)}) 251 main = gotoMeta push cs0 (record {context = (record {a = 100 ; b = 50 ; c = 70})
252 ; c' = 0 ; next = (N.cs id)})
222 ``` 253 ```
223 254
224 # Agda 上に CbC を記述した成果 255 # Agda 上に CbC を記述した成果
225 * 部分型で CbC の型付けができた 256 * 部分型で CbC の型付けができた
226 * メタ計算をきちんと階層化できた 257 * メタ計算をきちんと階層化できた
242 * 部分型を利用してCbCを型付け 273 * 部分型を利用してCbCを型付け
243 * 依存型をCbC に導入して自身を証明可能にする 274 * 依存型をCbC に導入して自身を証明可能にする
244 * 型情報から stub を自動生成すkる 275 * 型情報から stub を自動生成すkる
245 * 赤黒木の挿入に関する性質を証明する 276 * 赤黒木の挿入に関する性質を証明する
246 277
278 # 発表履歴
279 * Agda 入門.
280 * オープンソースカンファレンス 2014 Okinawa, May 2014.
281 * 形式手法を学び始めて思うことと、形式手法を広めるには(2p).
282 * 情報処理学会ソフトウェア工学研究会 (IPSJ SIGSE) ウィンターワークショップ 2015・ イン・宜野湾 (WWS2015), Jan 2015.
283 * Continuation based C を用いたプログラムの検証手法(6p).
284 * 2016 年並列/分散/協調処理に関する『松本』サマー・ワークショップ (SWoPP2016)
285 * 情報処理学会・プログラミング研究会 第 110 回プログラミング研究会 (PRO-2016-2) Aug 2016.
286
247 <!-- vim: set filetype=markdown.slide: --> 287 <!-- vim: set filetype=markdown.slide: -->
248 288