O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

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

46.234 visualizações

Publicada em

Agda で論理学

Publicada em: Engenharia
  • Entre para ver os comentários

証明プログラミング入門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. おわり 証明プログラミングを楽しみましょう!

×