Mercurial > hg > Papers > 2017 > atton-master
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 < 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 < 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->data[AkashaInfo]->akashaInfo.maxHeight > | 381 if (context->data[AkashaInfo]->akashaInfo.maxHeight > |
363 2*context->data[AkashaInfo]->akashaInfo.minHeight) | 382 2*context->data[AkashaInfo]->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 -> 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 |