comparison presentation/slide.html @ 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
84 84
85 <div class='slide '> 85 <div class='slide '>
86 <!-- === begin markdown block === 86 <!-- === begin markdown block ===
87 87
88 generated by markdown/1.2.0 on Ruby 2.3.3 (2016-11-21) [x86_64-darwin16] 88 generated by markdown/1.2.0 on Ruby 2.3.3 (2016-11-21) [x86_64-darwin16]
89 on 2017-02-13 17:40:39 +0900 with Markdown engine kramdown (1.13.0) 89 on 2017-02-14 11:30:47 +0900 with Markdown engine kramdown (1.13.0)
90 using options {} 90 using options {}
91 --> 91 -->
92 92
93 <!-- _S9SLIDE_ --> 93 <!-- _S9SLIDE_ -->
94 <h1 id="section">プログラミング言語とソフトウェアの信頼性</h1> 94 <h1 id="section">プログラミング言語とソフトウェアの信頼性</h1>
127 127
128 128
129 </div> 129 </div>
130 <div class='slide '> 130 <div class='slide '>
131 <!-- _S9SLIDE_ --> 131 <!-- _S9SLIDE_ -->
132 <h1 id="section-2">モデル検査的アプローチについての流れ</h1> 132 <h1 id="section-2">本発表ではモデル検査的アプローチについて中心に見ていきます</h1>
133 <ul>
134 <li>修士論文の内部の比率は半分半分くらい</li>
135 <li>定理証明の方は説明する内容が多くて複雑</li>
136 <li>モデル検査的アプローチは過去論文を提出したもの
137 <ul>
138 <li>なのでそちらをメインで発表します</li>
139 </ul>
140 </li>
141 </ul>
142
143
144 </div>
145 <div class='slide '>
146 <!-- _S9SLIDE_ -->
147 <h1 id="section-3">モデル検査的アプローチについての流れ</h1>
133 <ul> 148 <ul>
134 <li>Continuation based C (CbC) 言語について</li> 149 <li>Continuation based C (CbC) 言語について</li>
135 <li>CbC における CodeSegment と DataSegment を用いたプログラミングスタイル</li> 150 <li>CbC における CodeSegment と DataSegment を用いたプログラミングスタイル</li>
136 <li>CbC とメタ計算について</li> 151 <li>CbC とメタ計算について</li>
137 <li>CbC で記述された GearsOS とそのデータ構造である赤黒木</li> 152 <li>CbC で記述された GearsOS とそのデータ構造である赤黒木</li>
157 <!-- _S9SLIDE_ --> 172 <!-- _S9SLIDE_ -->
158 <h1 id="codesegment">CodeSegment</h1> 173 <h1 id="codesegment">CodeSegment</h1>
159 <ul> 174 <ul>
160 <li>CodeSegment とは 175 <li>CodeSegment とは
161 <ul> 176 <ul>
162 <li>処理の単位</li> 177 <li>処理の単位であり、入力と出力を持つ</li>
163 <li>結合や分割が容易</li> 178 <li>結合や分割が容易</li>
164 <li>入力と出力を持つ</li> 179 </ul>
165 </ul> 180 </li>
166 </li> 181 <li>CodeSegment どうしを接続することによりプログラム全体を作る
167 <li>CodeSegment どうしを接続することによりプログラム全体を作る</li> 182 <ul>
183 <li>関数呼び出しと違って戻ってこない(goto)</li>
184 </ul>
185 </li>
168 </ul> 186 </ul>
169 187
170 <p><img src="./images/cs.svg" alt="cs" width="50%" /></p> 188 <p><img src="./images/cs.svg" alt="cs" width="50%" /></p>
189
190 <pre><code>__code cs0(int a, int b){
191 goto cs1(a+b);
192 }
193 </code></pre>
171 194
172 195
173 </div> 196 </div>
174 <div class='slide '> 197 <div class='slide '>
175 <!-- _S9SLIDE_ --> 198 <!-- _S9SLIDE_ -->
184 </li> 207 </li>
185 </ul> 208 </ul>
186 209
187 <p><img src="./images/ds.svg" alt="ds" width="50%" /></p> 210 <p><img src="./images/ds.svg" alt="ds" width="50%" /></p>
188 211
189 212 <pre><code>__code cs0(int a, int b){
190 </div> 213 goto cs1(a+b);
191 <div class='slide '> 214 }
192 <!-- _S9SLIDE_ --> 215 </code></pre>
193 <h1 id="section-3">メタ計算</h1> 216
217
218 </div>
219 <div class='slide '>
220 <!-- _S9SLIDE_ -->
221 <h1 id="section-4">メタ計算</h1>
194 <ul> 222 <ul>
195 <li>とある計算を実現するための計算</li> 223 <li>とある計算を実現するための計算</li>
196 <li>ネットワーク接続、例外処理、メモリ確保、並列処理など</li> 224 <li>ネットワーク接続、例外処理、メモリ確保、並列処理など</li>
197 <li>CbC は通常レベルの計算とメタ計算を分離して考える 225 <li>CbC は通常レベルの計算とメタ計算を分離して考える
198 <ul> 226 <ul>
242 270
243 271
244 </div> 272 </div>
245 <div class='slide '> 273 <div class='slide '>
246 <!-- _S9SLIDE_ --> 274 <!-- _S9SLIDE_ -->
247 <h1 id="section-4">赤黒木</h1> 275 <h1 id="section-5">赤黒木</h1>
248 <ul> 276 <ul>
249 <li>データの保存に用いる二分木</li> 277 <li>データの保存に用いる二分木</li>
250 <li>特に赤黒木はノードが持つ赤か黒の色を使って木のバランスを取る 278 <li>特に赤黒木はノードが持つ赤か黒の色を使って木のバランスを取る
251 <ul> 279 <ul>
252 <li>ルートノードと葉ノードの色は黒</li> 280 <li>ルートノードと葉ノードの色は黒</li>
254 <li>ルートから最下位ノードへの経路に含まれる黒ノードの数はどの最下位ノードでも一定</li> 282 <li>ルートから最下位ノードへの経路に含まれる黒ノードの数はどの最下位ノードでも一定</li>
255 </ul> 283 </ul>
256 </li> 284 </li>
257 </ul> 285 </ul>
258 286
259 <p><img src="./images/rbtree.svg" alt="rbtree" width="50%" /></p> 287 <p><img src="./images/rbtree.svg" alt="rbtree" width="35%" /></p>
260 288
261 289
262 </div> 290 </div>
263 <div class='slide '> 291 <div class='slide '>
264 <!-- _S9SLIDE_ --> 292 <!-- _S9SLIDE_ -->
269 <li>GearsOS では木の実装のためにスタックを用いて経路情報を保持している</li> 297 <li>GearsOS では木の実装のためにスタックを用いて経路情報を保持している</li>
270 </ul> 298 </ul>
271 299
272 <p><img src="./images/put.svg" alt="put" width="50%" /></p> 300 <p><img src="./images/put.svg" alt="put" width="50%" /></p>
273 301
274 302 <pre><code>goto meta(context, Put);
275 </div> 303 </code></pre>
276 <div class='slide '> 304
277 <!-- _S9SLIDE_ --> 305
278 <h1 id="section-5">仕様の記述とその確認</h1> 306 </div>
307 <div class='slide '>
308 <!-- _S9SLIDE_ -->
309 <h1 id="section-6">仕様の記述とその確認</h1>
279 <ul> 310 <ul>
280 <li>「バランスが取れている」とは何かを表現できる必要がある 311 <li>「バランスが取れている」とは何かを表現できる必要がある
281 <ul> 312 <ul>
282 <li>実行可能な CbC の式を使った assert になる</li> 313 <li>実行可能な CbC の式を使った assert になる</li>
283 </ul> 314 </ul>
303 <li>仕様は bool になる式を用いた assert</li> 334 <li>仕様は bool になる式を用いた assert</li>
304 <li>デメリット: promela は C とは記述が異なる</li> 335 <li>デメリット: promela は C とは記述が異なる</li>
305 </ul> 336 </ul>
306 </li> 337 </li>
307 </ul> 338 </ul>
339
340 <pre><code>assert(x &lt; 10);
341 </code></pre>
308 342
309 343
310 </div> 344 </div>
311 <div class='slide '> 345 <div class='slide '>
312 <!-- _S9SLIDE_ --> 346 <!-- _S9SLIDE_ -->
324 <li>有限ステップ検証する有界モデル検査器</li> 358 <li>有限ステップ検証する有界モデル検査器</li>
325 </ul> 359 </ul>
326 </li> 360 </li>
327 </ul> 361 </ul>
328 362
329 363 <pre><code>assert(x &lt; 10);
330 </div> 364 </code></pre>
331 <div class='slide '> 365
332 <!-- _S9SLIDE_ --> 366
333 <h1 id="akasha">メタ計算ライブラリ akasha</h1> 367 </div>
334 <ul> 368 <div class='slide '>
335 <li>メタ計算としてプログラムの状態を数え上げる 369 <!-- _S9SLIDE_ -->
336 <ul> 370 <h1 id="section-7">チェックする仕様</h1>
337 <li>goto された時に挿入される要素の組み合わせを全て列挙して実行する</li>
338 <li>その度に仕様の式は成り立つかをチェックする</li>
339 </ul>
340 </li>
341 <li>ノーマルレベルのコードを検証用に変更せず検証可能</li>
342 </ul>
343
344 <p><img src="./images/akashaPut.svg" alt="akashaPut" width="51%" /></p>
345
346
347 </div>
348 <div class='slide '>
349 <!-- _S9SLIDE_ -->
350 <h1 id="section-6">チェックする仕様</h1>
351 <ul> 371 <ul>
352 <li>赤黒木の高さに関する仕様に以下のものがある 372 <li>赤黒木の高さに関する仕様に以下のものがある
353 <ul> 373 <ul>
354 <li>木をルートから辿った際に最も長い経路は最も短い経路の高々2倍に収まる</li> 374 <li>木をルートから辿った際に最も長い経路は最も短い経路の高々2倍に収まる</li>
355 </ul> 375 </ul>
356 </li> 376 </li>
357 <li>以下のように assert を用いて CbC で定義できる</li> 377 <li>以下のような条件式を仕様として CbC で定義、検証できる</li>
358 <li>この仕様が満たされるかをチェックする</li>
359 </ul> 378 </ul>
360 379
361 <pre><code>__code verifySpecificationFinish(struct Context* context) { 380 <pre><code>__code verifySpecificationFinish(struct Context* context) {
362 if (context-&gt;data[AkashaInfo]-&gt;akashaInfo.maxHeight &gt; 381 if (context-&gt;data[AkashaInfo]-&gt;akashaInfo.maxHeight &gt;
363 2*context-&gt;data[AkashaInfo]-&gt;akashaInfo.minHeight) 382 2*context-&gt;data[AkashaInfo]-&gt;akashaInfo.minHeight)
371 390
372 391
373 </div> 392 </div>
374 <div class='slide '> 393 <div class='slide '>
375 <!-- _S9SLIDE_ --> 394 <!-- _S9SLIDE_ -->
395 <h1 id="akasha">メタ計算ライブラリ akasha</h1>
396 <ul>
397 <li>メタ計算としてプログラムの状態を数え上げる
398 <ul>
399 <li>goto された時に挿入される要素の組み合わせを全て列挙して実行する
400 <ul>
401 <li>赤黒木の状態の保存、挿入、チェック、次の状態の列挙、赤黒木の再現……</li>
402 </ul>
403 </li>
404 <li>その度に仕様の式は成り立つかをチェックする</li>
405 </ul>
406 </li>
407 <li>ノーマルレベルのコードを検証用に変更せず検証可能</li>
408 </ul>
409
410 <p><img src="./images/akashaPut.svg" alt="akashaPut" width="51%" /></p>
411
412
413 </div>
414 <div class='slide '>
415 <!-- _S9SLIDE_ -->
376 <h1 id="akasha--cbmc-">akasha と CBMC の比較</h1> 416 <h1 id="akasha--cbmc-">akasha と CBMC の比較</h1>
377 <ul> 417 <ul>
378 <li>akasha は有限の要素数の組み合わせをチェックする 418 <li>akasha は有限の要素数の組み合わせをチェックする
379 <ul> 419 <ul>
380 <li>要素数が13個までならどの順で木に挿入しても良い</li> 420 <li>要素数が13個までならどの順で木に挿入しても良い</li>
393 433
394 434
395 </div> 435 </div>
396 <div class='slide '> 436 <div class='slide '>
397 <!-- _S9SLIDE_ --> 437 <!-- _S9SLIDE_ -->
398 <h1 id="section-7">定理証明的なアプローチの流れ</h1>
399 <ul>
400 <li>プログラムを証明するにはどうするのか</li>
401 <li>証明支援系 Agda における証明</li>
402 <li>Agda による CbC の定義</li>
403 <li>Agda を用いて CbC のコードを証明する</li>
404 </ul>
405
406
407 </div>
408 <div class='slide '>
409 <!-- _S9SLIDE_ -->
410 <h1 id="continuation-based-c-">定理証明を Continuation based C へ適用するには</h1> 438 <h1 id="continuation-based-c-">定理証明を Continuation based C へ適用するには</h1>
411 <ul> 439 <ul>
412 <li>任意の回数だけ木の操作を行なっても大丈夫なことを保証したい</li> 440 <li>任意の回数だけ木の操作を行なっても大丈夫なことを保証したい</li>
413 <li>そのままプログラムの性質を保証してやる</li> 441 <li>そのままプログラムの性質を保証してやる</li>
414 <li>Coq, Agda, ATS2 などのプログラミング言語で証明が可能 442 <li>Coq, Agda, ATS2 などのプログラミング言語で証明が可能
473 </li> 501 </li>
474 <li>メタレベルを使うための制約を満たしていれば良い、ということを表現できれば良い</li> 502 <li>メタレベルを使うための制約を満たしていれば良い、ということを表現できれば良い</li>
475 <li>部分型を使う 503 <li>部分型を使う
476 <ul> 504 <ul>
477 <li>Java におけるインターフェース、Haskell における型クラス</li> 505 <li>Java におけるインターフェース、Haskell における型クラス</li>
478 <li>「このデータにはこのフィールドさえあれば良い」</li> 506 <li>「このフィールドXがあればデータ型Tとみなして良い」</li>
479 </ul> 507 </ul>
480 </li> 508 </li>
481 </ul> 509 </ul>
482 510
483 511
490 <ul> 518 <ul>
491 <li>cs0 の定義はメタ計算用に変更しなくても良い</li> 519 <li>cs0 の定義はメタ計算用に変更しなくても良い</li>
492 </ul> 520 </ul>
493 </li> 521 </li>
494 </ul> 522 </ul>
523
524 <pre><code>cs0 : CodeSegment ds0 ds1
525 cs0 = cs (\d -&gt; goto cs1 (record {c = (ds0.a d) + (ds0.b d)}))
526 </code></pre>
495 527
496 <pre><code>main : ds1 528 <pre><code>main : ds1
497 main = goto cs0 (record {a = 100 ; b = 50}) 529 main = goto cs0 (record {a = 100 ; b = 50})
498 </code></pre> 530 </code></pre>
499 <pre><code>main : Meta 531 <pre><code>main : Meta
500 main = gotoMeta push cs0 (record {context = (record {a = 100 ; b = 50 ; c = 70}) ; c' = 0 ; next = (N.cs id)}) 532 main = gotoMeta push cs0 (record {context = (record {a = 100 ; b = 50 ; c = 70})
533 ; c' = 0 ; next = (N.cs id)})
501 </code></pre> 534 </code></pre>
502 535
503 536
504 </div> 537 </div>
505 <div class='slide '> 538 <div class='slide '>
551 <li>依存型をCbC に導入して自身を証明可能にする</li> 584 <li>依存型をCbC に導入して自身を証明可能にする</li>
552 <li>型情報から stub を自動生成すkる</li> 585 <li>型情報から stub を自動生成すkる</li>
553 <li>赤黒木の挿入に関する性質を証明する</li> 586 <li>赤黒木の挿入に関する性質を証明する</li>
554 </ul> 587 </ul>
555 588
589
590 </div>
591 <div class='slide '>
592 <!-- _S9SLIDE_ -->
593 <h1 id="section-11">発表履歴</h1>
594 <ul>
595 <li>Agda 入門.
596 <ul>
597 <li>オープンソースカンファレンス 2014 Okinawa, May 2014.</li>
598 </ul>
599 </li>
600 <li>形式手法を学び始めて思うことと、形式手法を広めるには(2p).
601 <ul>
602 <li>情報処理学会ソフトウェア工学研究会 (IPSJ SIGSE) ウィンターワークショップ 2015・ イン・宜野湾 (WWS2015), Jan 2015.</li>
603 </ul>
604 </li>
605 <li>Continuation based C を用いたプログラムの検証手法(6p).
606 <ul>
607 <li>2016 年並列/分散/協調処理に関する『松本』サマー・ワークショップ (SWoPP2016)</li>
608 <li>情報処理学会・プログラミング研究会 第 110 回プログラミング研究会 (PRO-2016-2) Aug 2016.</li>
609 </ul>
610 </li>
611 </ul>
612
556 <!-- vim: set filetype=markdown.slide: --> 613 <!-- vim: set filetype=markdown.slide: -->
557 614
558 <!-- === end markdown block === --> 615 <!-- === end markdown block === -->
559 </div> 616 </div>
560 617