Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

45,316 views

Published on

Agda で論理学

Published in: Engineering

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

  1. 1. 証明プログラミング超入門 ∼述語論理を添えて∼ 2015/03/27 門脇 香子(@kdxu) 1
  2. 2. 自己紹介 • 門脇 香子 (@kdxu) • お茶の水女子大学 浅井研(M1) • 研究はコンパイラの定式化 • 趣味でゲーム開発
  3. 3. みなさん証明は好きですか?
  4. 4. 概要 • 証明プログラミングとは? • Agda による例
 1. ふつうの証明
 2. 命題論理と述語論理
  5. 5. 証明プログラミングとは? • ある種の性質を保障したプログラムが書ける
 数学の定理を証明したり,停止性などの性質が保障された コンパイラなどを実装できる • コードの停止性,正当性などを証明できる
 活用例 : OpenSSLの脆弱性の発見 
     CompCert(安全性が保証されたCコンパイラ) • テストではなく証明で正しさを保証する • TDDからPDDへ(Proof-Driven-Development!)
  6. 6. Agda について • もっとも有名な定理証明支援系の1つ • 依存型という型を使用できる • Syntax としては Haskell に近い • 証明を項として表し直接操作する
  7. 7. インストール&セットアップ • 適当にググる
 $ cabal install agda
 $ agda-mode setup • AgdaWikiを見ましょう
  8. 8. 書いてみよう
  9. 9. まずは型定義 • data で新しい型を定義できる • indent に注意 • Set の部分集合としてのBool型という意味
  10. 10. まずは型定義 • 自然数の型 • ペアノの公理による定義 • zeroがNat型ということと,xがNat型ならsuc x もNat型だということを示している
  11. 11. 関数定義 • 普通の足し算の定義 • (suc m) + n = (suc (m + n)) • C-c C-n で関数を評価できます
  12. 12. 関数定義 • 中値記法もできます
  13. 13. 関数定義
  14. 14. 何か証明してみよう • Nat 型と Bool 型の簡単な定義はできた • ここでなにか簡単な定理を証明する • 同値性の証明をするならば同値関係のデータ型が必 要(equality)
 -> どのように定義するのか?
  15. 15. 同値性 • 2つのものが同じということは,以下のように定義できる • 例 : zero (suc zero) はダメ
 x x の形をしていない.型はあるが,値が存在しない
 なので,reflという型にならない • reflになりうる値が存在するか で同値性が定義できる
  16. 16. 定理は関数 • 例えば 0 + n n を示したい
 -> 返り値がreflとなるように関数を書ければよい • 関数の型は
 (n : Nat) → (0 + n n)
 となる • ここで suc 関数に対する再帰的処理が必要になる
  17. 17. 定理 = 関数 • これを Agda は 型が等しい と判断してくれない • ここで suc 関数に対する再帰的処理が必要になる • 一般的に定理を再帰的に示す関数 cong (congruence : 合同の意)を定義

  18. 18. 証明完了! • zero と suc nで場合分けしている (C-c C-c n)
 zero の場合は zero + zero は zeroなので直ちにrefl
 suc n の場合は n に関して再帰的に証明をする
  19. 19. Tips : 依存型 • Agda では依存型(Dependent Types)という型が使えます • 「値に依存する型」を作ることができる型 • 例 Vec N 型 - 長さを型レベルで保持しているリスト • 型の段階で長さの比較や空リスト判定を保証できる
  20. 20. 本題に入ります
  21. 21. 今日の目的 • 一階述語論理をAgdaで表現し,何かを証明する • 一階述語論理って?そもそも述語論理って?
  22. 22. 今日の目的 • 一階述語論理をAgdaで表現し,何かを証明する • 一階述語論理って?そもそも述語論理って?
  23. 23. 命題論理 • 述語論理は命題論理の拡張 • 命題論理 : P → Q ,¬ P Q みたいなやつ
 命題変数(P,Qなど)を原子式(それ以上分解できな い命題)とした推論体系 • 推論の性質によりさまざまな論理体系がある
  24. 24. 命題論理の構文要素 • 原子式 : P,Q,R … • 真理値 真(⊤)または偽( ) • 結合子 : ¬, , など • これらを組み合わせてさまざまな論理式をつくる
  25. 25. 一階述語論理 • 個体の量化のみを許す述語論理
 具体的には,古典論理に
 - 原子論理式
 - 量化
 が加わっている.
  26. 26. 一階述語論理 • 量子論理式
 例 : P x y z … • 項を関係として表す
  27. 27. 量化 • 「すべての x において ∼である」「∼を満たす x が存在する」 • 全称量化( ),存在量化( )
  28. 28. 一階述語論理 at Agda https://gist.github.com/KDXU/3ecf21603abe9e9a409e
  29. 29. 量化 • 「すべての x において ∼である」「∼を満たす x が存在する」 • 全称量化( ),存在量化( )
  30. 30. 一階述語論理式の例 • 例 : y x Loves(x,y)
 ‒ Everyone in the world is loved by at least one person • 例2 : x y Loves(x,y)
 ‒ There is a person who loves everyone in the world
  31. 31. おすすめ教材 • 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/)
  32. 32. • 私は今日紹介した Agda という言語を用いて証明 付きの型推論器を構成しています • 実装 : https://github.com/kdxu/InferAgda
  33. 33. おわり 証明プログラミングを楽しみましょう!

×