Mercurial > hg > Papers > 2015 > atton-sigse
view slide/slide.html @ 54:40344cc2c590 default tip
Add position by kono-teacher
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 22 Jan 2015 22:24:55 +0900 |
parents | 65391f6321a8 |
children |
line wrap: on
line source
<!DOCTYPE HTML> <html lang="Japanese"> <head> <title>形式手法を広めるには</title> <meta charset="UTF-8"> <meta name="viewport" content="width=1274, user-scalable=no"> <meta name="generator" content="Slide Show (S9)"> <meta name="author" content="河野真治 <br> 比嘉健太"> <link rel="stylesheet" href="themes/ribbon/styles/style.css"> <link rel="stylesheet" href="slide.css"> </head> <body class="list"> <header class="caption"> <h1>形式手法を広めるには</h1> <p>河野真治 <br> 比嘉健太</p> </header> <div class="slide cover" id="Cover"><div> <section> <header> <h2>形式手法を広めるには</h2> <h3 id="author">河野真治 <br> 比嘉健太</h3> <h3 id="profile">琉球大学工学部情報工学科</h3> </header> </section> </div></div> <!-- todo: add slide.classes to div --> <!-- todo: create slide id from header? like a slug in blogs? --> <div class="slide" id="2"><div> <section> <header> <h1 id="agenda">Agenda</h1> </header> <!-- === begin markdown block === generated by markdown 1.1.1 on Ruby 2.2.0 (2014-12-25) [x86_64-darwin13] on 2015-01-22 22:24:17 +0900 with Markdown engine kramdown (1.4.2) using options {} --> <!-- _S9SLIDE_ --> <ul> <li>大学ではどんなことをやっているか(講義, イベント, 研究)</li> <li>ポジション(河野)</li> <li>ポジション(比嘉)</li> </ul> </section> </div></div> <div class="slide" id="3"><div> <section> <header> <h1 id="section">講義で使用している形式手法</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>仕様記述 <ul> <li>UML</li> </ul> </li> <li>model checking 的なアプローチ <ul> <li>Java Path Finder</li> </ul> </li> <li>証明的なアプローチ <ul> <li>Haskell, Agda</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="4"><div> <section> <header> <h1 id="section-1">仕様記述</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>モデリングと設計 の講義</li> <li>iOS Application を作成する</li> <li>ユースケース図やクラス図を使って仕様を考える</li> </ul> </section> </div></div> <div class="slide" id="5"><div> <section> <header> <h1 id="model-checking-">model checking 的なアプローチ</h1> </header> <!-- _S9SLIDE_ --> <ul> <li><a href="http://www.ie.u-ryukyu.ac.jp/%7Ekono/lecture/os/index.html">Operationg System</a> の講義</li> <li>Process/Thread Scheduling を考えた時に</li> <li>Dead Lock を起こすような Scheduling を実際に書いて実行させる</li> <li>Java Path Finder で Thread の実行順序を網羅的に実行する</li> </ul> </section> </div></div> <div class="slide" id="6"><div> <section> <header> <h1 id="section-2">証明的なアプローチ</h1> </header> <!-- _S9SLIDE_ --> <ul> <li><a href="http://www.ie.u-ryukyu.ac.jp/%7Ekono/lecture/software/index.html">ソフトウェア工学</a> の講義</li> <li>集合, 論理, 関数, 自然演繹による証明</li> <li>型システム, Curry-Howard Isomorphism を通して Haskell, Agda で証明</li> <li>Haskell : 自然演繹と lambda calculus</li> <li>Agda : Category, Data type の証明 (Product, Sum, List, Functor, Monad …)</li> <li>Agda : SystemT を使った自然数に対する演算の証明</li> </ul> </section> </div></div> <div class="slide" id="7"><div> <section> <header> <h1 id="agda-">Agda による証明を解説した例</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>Open Source Conference</li> <li>ソフトウェア工学で学んだ Agda を <a href="http://ie.u-ryukyu.ac.jp/~e115763/slides/events/osc2014/slide.html">Agda 入門</a>として発表</li> <li>Agda で SystemT の Nat の加法の交換法則を解説</li> <li>定義の解説にほとんどの時間を取られてしまう</li> </ul> </section> </div></div> <div class="slide" id="8"><div> <section> <header> <h1 id="delta-monad">圏によるプログラムの形式化 : Delta Monad</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>プログラムの変更を Monad で表す</li> <li>プログラムの変更時に変更前のプログラムも残したまま変更する</li> <li>全てのバージョンのプログラムを同時に実行できる</li> <li>デバッグやテストと組み合せることでバグを見付けたい</li> <li>実行系と検証系を同時に走らせることもできる</li> </ul> </section> </div></div> <div class="slide" id="9"><div> <section> <header> <h1 id="section-3">ポジション(河野)</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>形式手法を学習するには</li> <li>形式手法とツール</li> <li>形式手法とワークフロー</li> <li>形式手法と証明</li> <li>形式手法の将来</li> </ul> </section> </div></div> <div class="slide" id="10"><div> <section> <header> <h1 id="section-4">形式手法を学習するには</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>学習するには本や論文を読み、問題を一つ一つ解いていく必要がある <ul> <li>長く手間がかかる作業</li> <li>一方でルールの適用なので誰がやっても結果は同じ</li> <li>難しいのはルールの適用から意味のある結果を得ること</li> <li>そこが想像できないと「わからない」ということになる</li> <li>わからないのではなくて、わかることに価値を見出せなくなる</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="11"><div> <section> <header> <h1 id="section-5">形式手法とツール</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>実際の形式ツールを使うためには <ul> <li>どういうツールがあるのか調べる</li> <li>環境を作ってそのツールを理解する</li> </ul> </li> <li>使いこなすことでバグが取れたとして <ul> <li>その利益はどこにあるのか</li> <li>研究開発が速くなるのか, 質が良くなるのか</li> </ul> </li> <li>理解して使う必要がある</li> </ul> </section> </div></div> <div class="slide" id="12"><div> <section> <header> <h1 id="section-6">形式手法とワークフロー</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>研究開発は分散版管理を用いて行なわれている <ul> <li>Pull Request, Project Management Tool などで研究状況を認識</li> </ul> </li> <li>分散版管理そのものは形式的に定義できると考えている <ul> <li>Delta Monad というものを提案している</li> </ul> </li> <li>学んで理解する教育手順そのものを研究室のワークフローとしたい <ul> <li>ツールを組み込んだワークフローが有効であることを示したい</li> <li>例) Pull Requeset 単位での model checking</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="13"><div> <section> <header> <h1 id="section-7">形式手法と証明</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>Agda は積極的に導入している <ul> <li>時間がかかるので使いどころは限られる</li> </ul> </li> <li>形式手法を学んだり証明の見落しを調べるのに便利</li> <li>証明を研究開発の過程に組込むのは難しい <ul> <li>しかし方向性を示すのに用いることはできる</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="14"><div> <section> <header> <h1 id="section-8">形式手法の将来</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>将来的にプログラムのかなりの部分は証明される <ul> <li>ライブラリもほとんど論文では証明が存在する</li> <li>形式手法で示すことは信頼性のにも繋がる</li> <li>しかしプログラム全体に広めるのは時間がかかるしできるか不明</li> </ul> </li> <li>形式手法の基本を理解し、いくつかのツールを使える人材を企業に送りこむのが良い</li> </ul> </section> </div></div> <div class="slide" id="15"><div> <section> <header> <h1 id="section-9">ポジション(比嘉)</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>講義などでつまづいたポイント</li> <li>つまづきの解決策</li> <li>どのような講義をするべきか?</li> </ul> </section> </div></div> <div class="slide" id="16"><div> <section> <header> <h1 id="section-10">学習コスト</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>論理, 自然演繹 -> Haskell -> Agda</li> <li>それぞれのステップに壁がある</li> <li>論理とプログラム間で変換できないなど</li> <li>自然演繹では解けるけれど lambda term で書き直す</li> <li>Haskell では定義できるけれど Agda で証明できない</li> </ul> </section> </div></div> <div class="slide" id="17"><div> <section> <header> <h1 id="section-11">つまづくポイント</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>Haskell -> Agda の壁を考える</li> <li>コードを書いてる人なら型を合わせることは分かる</li> <li>型によって証明を書くことに繋げるには? <ul> <li>プログラムと論理の対応を把握してもらう必要がある</li> <li>どうしたら把握してもらえるか?</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="18"><div> <section> <header> <h1 id="section-12">つまづきをどう解決するか</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>書き続ける</li> <li>論理とプログラムの対応を見えるようにする <ul> <li>Agda は対話的に項を書き換えることができる</li> <li>どこでつまづいても情報が手に入るようにしたい <ul> <li>論理側でも、プログラム側でも、どのステップでも</li> </ul> </li> <li>対話的に情報を引き出す手段そのものを学ぶ</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="19"><div> <section> <header> <h1 id="section-13">他に講義に取りいれるもの?</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>仕様記述</li> <li>他の証明支援系 <ul> <li>Coq, …</li> </ul> </li> <li>他の理論 <ul> <li>Hoare Logic, Computational Tree Logic, …</li> </ul> </li> <li>どのようなカリキュラムが良いか?</li> </ul> </section> </div></div> <div class="slide" id="20"><div> <section> <header> <h1 id="delta-">データ構造 Delta の定義</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>Monad によってプログラムの変更を表す</li> <li>データ構造としては長さ1以上のリスト <ul> <li>nil に相当するものが元のプログラムの値</li> <li>プログラムの変更は変更した後の値を List に追加する</li> <li>全ての関数は Delta を返し、値は Delta によって定義する</li> </ul> </li> </ul> <pre><code>data Delta a = Mono a | Delta a (Delta a) </code></pre> </section> </div></div> <div class="slide" id="21"><div> <section> <header> <h1 id="delta--monad--instance-">Delta に対する Monad の instance 定義</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>return はバージョンが無いプログラムをバージョン1とする</li> <li><code>>>=</code> は同じバージョンの値に対する計算を同時に行なう</li> </ul> <pre><code>instance Monad Delta where return x = Mono x (Mono x) >>= f = f x (Delta x d) >>= f = Delta (headDelta (f x)) (d >>= (tailDelta . f)) </code></pre> </section> </div></div> <div class="slide" id="22"><div> <section> <header> <h1 id="section-14">元のプログラムとプログラムの変更</h1> </header> <!-- _S9SLIDE_ --> <p><img src="pictures/original_program.svg" alt="original_program" /></p> </section> </div></div> <div class="slide" id="23"><div> <section> <header> <h1 id="delta--1">Delta によって記述されたプログラムの実行</h1> </header> <!-- _S9SLIDE_ --> <p><img src="pictures/delta_program.svg" alt="delta_program" /></p> </section> </div></div> <div class="slide" id="24"><div> <section> <header> <h1 id="delta--2">Delta のメリット</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>全てのバージョンを同時に実行できる</li> <li>任意のバージョンの組み合せを同時に実行できる <ul> <li>デバッグに利用したり 通常系/検証系 として動かす</li> </ul> </li> <li>Monad なので Category との対応がある <ul> <li>2 つのバージョンを選ぶことは Delta が持つプログラムの product</li> <li>任意のバージョンを生成できる Colimit は Program の Repository</li> </ul> </li> </ul> <style> .slide.cover H2 { margin-top:72px; font-size:72px; } .slide.cover H3#author { margin-top:72px; font-size:42px; } </style> <!-- vim: set filetype=markdown.slide: --> <!-- === end markdown block === --> </section> </div></div> <script src="scripts/script.js"></script> <!-- Copyright © 2010–2011 Vadim Makeev, http://pepelsbey.net/ --> </body> </html>