Mercurial > hg > Members > atton > generated_seminar_slides
view slides/20140520/slide.html @ 49:be4bda2c5e58
auto-Update generated slides by script
author | Yasutaka Higa <e115763@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 28 Oct 2014 10:57:47 +0900 |
parents | dfd2f6a3c82d |
children | d4e4ecc1c347 |
line wrap: on
line source
<!DOCTYPE HTML> <html lang="Japanese"> <head> <title>Agda 入門</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="Yasutaka Higa"> <link rel="stylesheet" href="themes/ribbon/styles/style.css"> <style> #Cover H2 { color:#FFF; text-align:center; font-size:70px; } </style> </head> <body class="list"> <header class="caption"> <h1>Agda 入門</h1> <p>Yasutaka Higa</p> </header> <div class="slide bg" id="Cover"><div> <section> <header> <h2>Agda 入門</h2> </header> <img src="pictures/" alt=""> <!-- © John Carey, http://fiftyfootshadows.net/ --> </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="section">このセミナーの目的</h1> </header> <!-- === begin markdown block === generated by markdown 1.1.1 on Ruby 2.1.2 (2014-05-08) [x86_64-darwin13.0] on 2014-08-05 16:09:25 +0900 with Markdown engine kramdown (1.3.3) using options {} --> <!-- _S9SLIDE_ --> <ul> <li>証明支援系の言語である Agda の入門を目的としています</li> <li>具体的には <ul> <li>Agda による証明の方法を知る</li> <li>実際に自然数の加算の交換法則の証明を追う</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="3"><div> <section> <header> <h1 id="section-1">セミナーについて必要する事前知識</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>なお、このセミナーについては <ul> <li>C や Java によるプログラミング言語を書いたことがある <ul> <li>関数や引数、型といった単語の詳細は省略することがあります</li> </ul> </li> <li>数学における述語論理 <ul> <li>P ならば Q といった論理</li> </ul> </li> </ul> </li> <li>といったことを前提条件としています</li> </ul> </section> </div></div> <div class="slide" id="4"><div> <section> <header> <h1 id="agda-">Agda とはどういう言語なのか</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>証明支援系と呼ばれる分野の言語です <ul> <li>他には Coq などがあります</li> </ul> </li> <li>Haskell で実装されています</li> <li>dependent type の言語 です <ul> <li>型から生成さえれた型を扱える</li> <li>いわゆる「強い静的型付け」などと言われる種類です</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="5"><div> <section> <header> <h1 id="curry-howard-isomorphism">型と証明との対応 : Curry-Howard Isomorphism</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>Agda における証明は <ul> <li>証明したい命題 == 関数の型</li> <li>命題の証明 == 関数の定義</li> </ul> </li> <li>として定義します。</li> <li>関数と命題の対応を Curry-Howard Isomorphism と言います</li> </ul> </section> </div></div> <div class="slide" id="6"><div> <section> <header> <h1 id="a--b--a--b">‘A ならば B’ と ‘A’ が成り立つなら ‘B’</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>Agda において <ul> <li>apply : A -> (A -> B) -> B</li> <li>apply a f = f a</li> </ul> </li> <li>と記述します</li> </ul> </section> </div></div> <div class="slide" id="7"><div> <section> <header> <h1 id="agda-syntax">Agda のSyntax</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>apply : A -> (A -> B) -> B</li> <li> <p>apply a f = f a</p> </li> <li>関数名 : 型</li> <li>関数名 <引数,,,> = 定義</li> </ul> </section> </div></div> <div class="slide" id="8"><div> <section> <header> <h1 id="agda-syntax-1">Agda の型のSyntax</h1> </header> <!-- _S9SLIDE_ --> <ul> <li> <p>apply : A -> (A -> B) -> B</p> </li> <li>引数の型 -> 返り値の型</li> <li>結合は右結合です。なのでこのようになります <ul> <li>A -> ((A -> B) -> B)</li> </ul> </li> <li>右結合のため、A を受けとって ((A -> B) -> B) を返す、とも読めます</li> </ul> </section> </div></div> <div class="slide" id="9"><div> <section> <header> <h1 id="agda-syntax--">Agda の型のSyntax : 複数の引数</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>複数の引数は <ul> <li>Arg1Type -> Arg2Type -> ReturnType</li> </ul> </li> <li>のように書きますが、右結合により <ul> <li>Arg1Type -> (Arg2Type -> ReturnType)</li> </ul> </li> <li>となり、引数は1つしかないと考えることができます。</li> <li>これを Curry 化と言い、引数が複数の場合を考えずに良くなります</li> </ul> </section> </div></div> <div class="slide" id="10"><div> <section> <header> <h1 id="c--syntax-">関数の定義を C の Syntax 書くと</h1> </header> <!-- _S9SLIDE_ --> <ul> <li> <p>apply : A -> (A -> B) -> B</p> </li> <li>B apply(A a, B ( * f )(A))</li> <li>これを満たす定義を関数applyの実装として書けば良い</li> <li>証明 == 正しい返り値を返す なので</li> <li>つまりコンパイルを通してしまえば良い</li> </ul> </section> </div></div> <div class="slide" id="11"><div> <section> <header> <h1 id="agda--1">Agda で書いてみると</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>emacs から使うと良いです</li> <li>module < filename > where</li> <li>を先頭に書く必要があります</li> <li>証明を定義していく</li> <li>C-c C-l で型チェック(証明チェック)ができます</li> </ul> </section> </div></div> <div class="slide" id="12"><div> <section> <header> <h1 id="agda--apply">Agda による apply</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>apply : A -> (A -> B) -> B</li> <li> <p>apply a f = f a</p> </li> <li>とは</li> <li>A を Int, B を String とすると</li> <li>Int と、 Int から String を返す関数があれば String を作れる</li> <li>と読めます。つまり関数適用です</li> </ul> </section> </div></div> <div class="slide" id="13"><div> <section> <header> <h1 id="section-2">命題に ‘ならば’ を含む場合</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>関数を返せば良いです</li> <li>Agda には lambda があるので <ul> <li>id : (A -> A)</li> <li>id = \a -> a</li> </ul> </li> <li>といったように書けます。</li> <li>lambda の syntax は \arg -> body です</li> </ul> </section> </div></div> <div class="slide" id="14"><div> <section> <header> <h1 id="section-3">‘ならば’ を含む証明</h1> </header> <!-- _S9SLIDE_ --> <ul> <li> <p>三段論法 の証明</p> </li> <li>compose : (A -> B) -> (B -> C) -> (A -> C)</li> <li> <p>compose f g = \a -> g (f a)</p> </li> <li>三段論法は関数の合成に相当しています</li> </ul> </section> </div></div> <div class="slide" id="15"><div> <section> <header> <h1 id="agda---">Agda による 証明 の方法のまとめ</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-4">自然数の加算の交換法則の証明</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>まずは自然数を定義する</li> <li>ペアノ算術を使います</li> </ul> </section> </div></div> <div class="slide" id="17"><div> <section> <header> <h1 id="section-5">ペアノ算術による自然数の定義</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>ゼロは自然数である</li> <li>自然数の後続数は自然数である</li> <li>TODO: 詳細は今から</li> </ul> </section> </div></div> <div class="slide" id="18"><div> <section> <header> <h1 id="agda--2">ペアノ算術の Agda による定義</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>data type を定義します</li> <li>data Int where</li> <li>O -> Int</li> <li>S -> Int -> Int</li> <li>Int は O か、 Int に S をかけたもの、とします</li> </ul> </section> </div></div> <div class="slide" id="19"><div> <section> <header> <h1 id="section-6">パターンマッチ</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>Agda においてはデータ型を引数で分解することができます</li> <li>ある型に続している値が、どのコンストラクタにおいて構成されたかをパターンで示せます</li> <li>これをパターンマッチと言います <ul> <li>double : Int -> Int</li> <li>double O = O</li> <li>double (S n) = S (S (double n))</li> </ul> </li> <li>関数名 (引数のパターン) = 定義</li> </ul> </section> </div></div> <div class="slide" id="20"><div> <section> <header> <h1 id="section-7">パターンマッチによる自然数の加算の定義</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>TODO: 今から</li> </ul> </section> </div></div> <div class="slide" id="21"><div> <section> <header> <h1 id="section-8">‘等しさ’ ということ</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>交換法則においては ‘等しい’ ということを証明しなければなりません</li> <li>等しい、ということも定義する必要があります</li> <li>命題は型で定義するため、’等しい’、という型が必要です</li> </ul> </section> </div></div> <div class="slide" id="22"><div> <section> <header> <h1 id="section-9">等しさをデータ型で定義する</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>== を定義していきます</li> <li>== は型でなくてはならないので <ul> <li>data <em>==</em> : {A : Set} -> A -> A -> Set where</li> </ul> </li> <li>となります</li> <li>よって、 hoge と fuga の等しさを証明したい場合は</li> <li>‘hoge == fuga’ 、という型を持つ項を関数の定義に書くことが証明になります</li> </ul> </section> </div></div> <div class="slide" id="23"><div> <section> <header> <h1 id="section-10">‘等しい’ということの定義3つ</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>TODO: refl, sym, cong を書きます</li> <li>comment <ul> <li>個人的には Relation.Binary.PropositionalEquality を open import するよりは自前で定義したい</li> <li>あと R とか reasoning もできれば使いたくない</li> <li>というか必要でないなら積極的に削っていかないと時間がおそらく足りない</li> <li>時間あまった時用に証明をもう1,2 個くらい書いておきたい</li> </ul> </li> </ul> </section> </div></div> <div class="slide" id="24"><div> <section> <header> <h1 id="section-11">交換法則を命題として定義する</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>== を用いて <ul> <li>(n : Int) -> (m : Int) -> n + m == m + n</li> </ul> </li> <li>引数は (名前 : 型) として名前付けできます</li> </ul> </section> </div></div> <div class="slide" id="25"><div> <section> <header> <h1 id="section-12">交換法則を証明する</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>交換法則を関数の定義として書いていきます</li> <li>TODO: 今から</li> </ul> </section> </div></div> <div class="slide" id="26"><div> <section> <header> <h1 id="agda--3">Agda による証明方法のまとめ</h1> </header> <!-- _S9SLIDE_ --> <ul> <li>関数の型を命題、関数の定義を証明とする</li> <li>命題を扱う必要があるため、型もデータ型として定義できる</li> <li>データ型はパターンマッチにより分解することができる</li> <li>C-c C-l により型のチェックが成功すれば証明終了</li> </ul> <!-- vim: set filetype=markdown.slide: --> <!-- === end markdown block === --> </section> </div></div> <!-- To hide progress bar from entire presentation just remove “progress” element. --> <div class="progress"><div></div></div> <script src="scripts/script.js"></script> <!-- Copyright © 2010–2011 Vadim Makeev, http://pepelsbey.net/ --> </body> </html>