初めて学ぶCoq

@yoshihiro503

2017年 7月 23日

自己紹介

Twitter @yoshihiro503
株式会社ドワンゴ コンテンツ基盤開発部
名古屋大学 客員JK
  • ツッコミは随時歓迎
  • コメントも歓迎

Coqを三行で

  • Coqはプログラミング言語(関数型言語)
  • Coqは仕様を書いて証明できる言語
  • つまり仕様が証明されたプログラミングがかける

Coqはプログラミング言語

たとえばこんなん

Fixpoint map{A B:Type}(f: A->B)(xs: list A):=
  match xs with
  | [] => []
  | x :: xs => f x :: map f xs
  end.

Coq は仕様記述言語

Theorem map_nth :
  forall (A B:Type) i (f: A->B) xs x,
  nth xs i = Some x ->
    nth (map f xs) i = Some (f x).

リスト xsi 番目が x だったら、map f xsi 番目は f x

証明

こんな感じ

induction i; (destruct xs; [discriminate |]).
- intros x Heq. now inversion Heq.
- simpl. now auto.

もう一度三行

  • Coqはプログラミング言語
  • Coqは仕様を書いて証明できる言語
  • つまり仕様が証明されたプログラミングがかける

Extraction機能

次のプログラミング言語のコードへ変換する

  • OCaml, Haskell, Scheme への変換

向いていること

  • 副作用のない関数プログラミング
  • 数学的に明快な仕様

向いていないこと

  • 仕様がほとんど実装と同じな場合
  • タイミングや速度に関する検証

まずは小さく始めよう

  • 一部のアルゴリズムだけをCoqで書いて証明する
  • 単体テストの一部を証明にする
  • 仕様を書くだけでも有用 (菊池効果)

身近な具体例

  • 通信プロトコル、暗号理論の形式化(産業技術総合研究所)
  • 金融情報システムにおける検証 (外国為替取引アプリ)
  • encoding, decording (Message Packライブラリの健全性)
  • テレビ放送に関する放送データ解析の最適化における健全性 ()
  • OpenSSLのバグの発見 (株式会社レピダム)
  • DBを使った処理に関してBASE特性の保証 (株式会社 NTTデータ)

CoqにまつわるTips

開発環境はどうしてる?

  • Proof General 派
  • CoqIDE 派
  • (coqtop派)

停止性が自明じゃないプログラム

停止性が自明な場合は Fixpoint で大丈夫だが、ちょっとでも非自明ならば Function コマンドを使う。

Recdef モジュールのインポートを忘れずに。

停止しなくてもよいプログラム

  • 無限に流れるTweetの列
  • 止まらないかもしれないループの実行列
  • CoInductiveによる無限データ構造
  • CoFixpointによる再帰関数定義

依存型

  • sig型 u : { user | age user > 18}
  • sumbool型 {x = y} + {x <> y}
  • フィールドに制約があるオブジェクト

証明報告書を納品する

coqdoc (HTML, PDF)

Coqのソースコードから証明報告書を自動生成

Coqのインストール方法

Coqの勉強会

社内Slackチャネル

社内の証明支援器のチャンネルに所属しよう。

  • ちな弊社 #proof #coq_beginner
  • なければ作ろう
  • そういう雰囲気じゃない場合は? → 転職

シール配布