@yoshihiro503 さんを講師とするCoq講義を受講しました。
感想などを書きます。
トップエスイー(http://www.topse.jp/wp/)の講義で、次のものでした。
トップエスイー特別講義「定理証明と検証」
http://topse.or.jp/docs/?q=node/36
講師は上にも書きましたが、
ITプランニングの今井宜洋さん ( @yoshihiro503 )です。
間違いや非公開情報などあれば、お手数ですがご指摘いただければと思います。
総論(感想):
・活用できる度合いはドメインによる
・ただちに強力に役立つ代表的なドメインはアルゴリズムの実装
・入力に対して出力が満たす性質を定義したい場合も強いと思う
・side effect は範囲外
・紙での証明が好き(得意)な人は楽しんで証明できると思います
できるようになったこと:
・Coq を使ったプログラミング
・Coq を使った証明(実装した関数が満たす性質の)
・Coq で実装したモジュールの多言語への Extract
定理証明系を活用した場合のメリット
・品質保証
・ユニットテストでは保証できない「性質」を保証できる
・性質とテストケースの違いの本質の一つは無限か有限の違いだと思います
・満たすべき性質の列挙を漏らさないように考える必要はもちろんある
・しかし性質を考えるのは個々のケースを考えるより楽しさを感じる(創造性を感じるワーク)
・ケースの列挙漏れの心配をせずに済むことはコストメリットを出せる可能性を感じる
定理証明系での難点
・副作用を伴う処理は範囲外
・動的な性質はユニットテストの専売特許と考えられる
・別言語での既存実装を証明したい、という場合は簡単ではない
・変換を含むので、変換ロジックの存在と、変換の妥当性という問題がある
講義で例として @yoshihiro503 さんの
迷路の最短路探索アルゴリズムの実装と、その正当性の証明の
ソースコード読みを行いました。参考資料に挙げておきます。
講義の後、力試しと演習のために、プログラミングCoqを読みつつ、
insertion sort の実装と証明をやってみました。
ところどころつまずくものの、だいたいは独力でできるようになりました。
SearchPattern が便利だと感じていて、証明は頭の中でも進めつつ、
これは成立している事実のはずだが Coq上ではまだ導出していない、
という事柄はSearchPattern を使えば必ずあるなぁ、と思いました。
一応書いたものを晒しておきます。
https://github.com/seizans/coqtest/blob/master/prog_coq/insertion_sort.v
これから作るものに generated by Coq なコードをねじ込んでいきたいと思います。
参考資料:
プログラミングCoq
http://www.iij-ii.co.jp/lab/techdoc/coqt/
迷路の最短経路探索アルゴリズムの実装と証明
https://bitbucket.org/yoshihiro503/maze_solver/src
Coq の証明駆動開発で Merge Sort 実装
http://d.hatena.ne.jp/yoshihiro503/20090923/p1