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>論理, 自然演繹 -&gt; Haskell -&gt; 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 -&gt; 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>&gt;&gt;=</code> は同じバージョンの値に対する計算を同時に行なう</li>
</ul>

<pre><code>instance Monad Delta where
  return x = Mono x
  (Mono x) &gt;&gt;= f     = f x
  (Delta x d) &gt;&gt;= f  = Delta (headDelta (f x))
                             (d &gt;&gt;= (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>