Successfully reported this slideshow.
Your SlideShare is downloading. ×

証明プログラミング超入門

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
自動定理証明の紹介
自動定理証明の紹介
Loading in …3
×

Check these out next

1 of 21 Ad

More Related Content

Slideshows for you (20)

Advertisement

Recently uploaded (20)

証明プログラミング超入門

  1. 1. 証明プログラミング超入門 2015/01/24 情報科学若手の会冬の陣 門脇 香子(@kdxu)
  2. 2. 自己紹介 • 門脇 香子 (@kdxu) • お茶の水女子大学 浅井研 M1 • 好きなもの : 型と自転車と音楽 • http://kodoku.tokyo
  3. 3. 概要 • 証明プログラミングとは? • Agda による例(布教)
 目標 : 高校数学レベルの簡単な証明 • (時間が余れば)ライブコーディング
  4. 4. 証明プログラミングとは? • ある種の性質を保障したプログラムが書ける
 数学の定理を証明したり,停止性などの性質が保障された コンパイラなどを実装できる • コードの停止性,正当性などを証明できる
 活用例 : OpenSSLの脆弱性の発見 
     CompCert(安全性が保証されたCコンパイラ) • テストではなく証明で正しさを保証する! • 安全,COOL,AWESOME !
  5. 5. Agda について • もっとも有名な定理証明支援系の1つ • 依存型という型を使用できる • Coq より「プログラミング言語」寄り • Syntax としては Haskell に近い • 証明を項として表し直接操作する
  6. 6. インストール&セットアップ • 要 Haskell-Platform • $ cabal install agda • $ agda-mode setup • 推奨エディタはAquamacsだそうです
  7. 7. 書いてみよう • まずA1.agdaというファイルを作り
 module A1 agda
 と先頭に書く.(ファイル名と同じにする) • C-c C-l でloadできます
  8. 8. まずは型定義 • data で新しい型を定義できる • indent に注意しましょう • Set の部分集合としてのBool型という意味
  9. 9. まずは型定義 • 自然数の型 • ペアノの公理による定義 • zeroがNat型ということと,xがNat型ならsuc x もNat型だということを示している
  10. 10. 関数定義 • 普通の足し算の定義 • (suc m) + n = (suc (m + n)) • C-c C-n で関数を評価できます
  11. 11. 関数定義 • 中値記法もできます
  12. 12. 関数定義
  13. 13. 何か証明してみよう • Nat 型と Bool 型の簡単な定義はできた • ここでなにか簡単な定理を証明してみます • 同値性の証明をするならば同値関係のデータ型が必 要(equality)
 -> どのように定義するのか?
  14. 14. 同値性 • 2つのものが同じということは,以下のように定義できる • 例 : zero (suc zero) はダメ
 x x の形をしていない.型はあるが,値が存在しない
 なので,reflという型にならない • reflにハマる値が存在するか で定義できる
  15. 15. 定理 = 関数 • 例えば 0 + n n を示したい
 -> 返り値がreflとなるように関数を書ければよい • 関数の型は
 (n : Nat) -> (0 + n n)
 となる • ここで suc 関数に対する再帰的処理が必要になる
  16. 16. 定理 = 関数 • これを Agda は 型が等しい と判断してくれない • ここで suc 関数に対する再帰的処理が必要になる • 一般的に定理を再帰的に示す関数 cong を定義

  17. 17. 証明完了! • zero と suc nで場合分けしている (C-c C-c n)
 zero の場合は zero + zero は zeroなので直ちにrefl
 suc n の場合は n に関して再帰的に証明をする
  18. 18. Tips : 依存型 • Agda では依存型(Dependent Types)という型が使えます • 「値に依存する型」を作ることができる型 • 例 Vec N 型 • 型の段階で長さの比較や空リスト判定を保証できる
  19. 19. おすすめ教材 • Ulf Norell 氏の Dependently Typed Programming in Agda 
 (http://www.cse.chalmers.se/ ulfn/darcs/AFP08/ LectureNotes/AgdaIntro.pdf) • Brutal [Meta]Introduction to Dependent Types in Agda 
 (http://oxij.org/note/BrutalDepTypes/) • お茶大製「みんなのAgda wiki」
 (http://agda.wiki.fc2.com/)
  20. 20. 研究紹介 • 私は今日紹介した Agda という言語を用いて安全 な型推論器を構成しています • 依存型の性質を用いて型変数の番号をうまく管理す ることで,セルの書き換えを用いずにUnification を行うことにより実装しています • https://github.com/kdxu/InferAgda
  21. 21. おわり 証明ができると世界が開けます.
 証明プログラミングを楽しみましょう!

×