Today アクセスカウンター Yesterday アクセスカウンター

Proof Assistant Coq

The Coq proof assistant

を,とりあえず apt-get でインストール (coq,coq-libs,coqide) してみようと思ったら,debian パッケージが壊れているっぽくて,インストールできませんでした (stable/testing/unstable いずれも).残念.そのうち直ると思うので,しばらく様子を見てみます(軟弱者).

ちなみに Coq ってのは,AgdaIsabelle/HOL と同じような,定理証明支援系のこと.Calculus of Inductive Construction とかいう,あまり聞きなじみが無い論理体系をベースにしているそうな.

# これについては,Interactive Theorem Proving And Program Development: Coq'art: The Calculus Of Inductive Constructions (Texts in Theoretical Computer Science. An Eatcs Series),という本が,けっこう高いけど,良いらしいです.

# Isabella/HOL のリンク先は,日本語の,とても貴重な定理証明系の説明スライドです.HOL ってのは,高階論理 (Higher Order Logic) のことらしいです.Coq はほとんど日本語の資料は無いみたいですが… Isabella や agda はけっこうあるみたい.例えば 型理論での形式的証明記述の技法について

さかいさんが使っている Agda は,関数型言語と同じような感じで証明を記述できるのがうりらしいのですが,私はもともと関数型言語全然わかりませんから… (^^;

というわけで,研究室の Windows にとりあえず Coq をインストールしてみました.一番歴史が古いらしく,完成度がとても高い気がします.

# そういえば,Agda はけっこうバギーだという噂を聞きますが,自分自身のソースコードは検証できないのでしょうか ? (笑)

普通に IDE 付きで,exe をダブルクリックすればインストール完了.Windows はよくわからないので,適当にパスを追加してみたりしましたが,何もしなくても動くかもしれません.とても簡単.やるな,Coq !

しっかし,チュートリアルを見ても,何がなんだか全然わかりません.IDE の使い方から,文法,コンパイル方法まで,謎だらけです.

今日はちょっと忙しかったので,インストールしただけですが,これから少しづつ使って見ようかと.とてつもなくディープな世界なので,絶対使いこなせる日はこないと思いますが w

# 「なるほど ITT の体系では選択公理が証明できるのか」とか,言ってみたい (笑)

最近ようやく Scheme とか Haskell などの関数型プログラミングが流行ってきたみたいなので,次のブームは定理証明系っしょ ! とか w

企業の面接で,
「大学では,どんなプログラミング言語をやってきましたか ?」
「はい,Coq を少々たしなみます」
なんて会話が普通になるんですよ w 今から備えておかないと (違

# しっかし,論理プログラミングとか,制約プログラミングは,なぜ流行らないのだろう… 型推論なんて,制約充足プログラミングパラダイムの一部です ! とか言って見るテスト w
# 関数型のブームにこっそり乗って,関数論理型プログラミングとして復活すれば,また流行るかも !?

どうでも良いですけど,IDE のスクリーンショットが斬新です w

Proof Fermat とかって,普通にあの超難問のフェルマー・ワイルズの定理を機械に証明させようとしています.アグレッシブだなぁ w


Theorem Fermat :
(forall x y z n:nat, x^n+y^n = z^n -> n <= 2)
Proof.


無邪気にもほどがあります w もちろん,絶対無理でしょう.100 頁以上にもわたって数式で埋め尽くされた,世界で 10 人も理解できないとかいう,そういうアレらしいですから w

# 100 年後ぐらいには,計算機で検証できるレベルまで精密化されるのかなぁ ?

ふと思ったのですが,現在の数学者でも,やっぱり紙とペンだけでがんばっているのでしょうか ? 定理証明支援系とかを使うのは邪道なんですかね ? それとも,数学の種類 (構成的) が違うから,あんまり使われて無いとか ?

TAPL と同時進行で,少しづつ進めていこう.型理論と聞くと,なじみが薄いので戸惑いますが,定理証明とか論理学と言い換えると,不思議に抵抗感が薄らぐのが不思議です.両者は等価なんですけどね.

# 私はもともと AI 屋 (今は複雑系工学講座とかにいます) なので.知識表現系とか,一階述語論理とか,そっち方面は,ほんのちょっとだけかじってます.ほんとうにちょっとですが.

ていうか,本業の研究の方がさっぱり進んでないのに,何やってんだ俺は… orz

コメント

Secret

私はCoqは一度挫折したので、Coqに慣れたら是非教えてください(^^;
Calculus of Inductive Construction は、私も名前しか知らないですが、多分 Calculus of Construction (CC) の変種でしょう。

Agdaで「関数型言語と同じような感じで証明が書ける」というのは、例えば「AならばB」を証明するには、「Aの証明を受け取ってBの証明を返す関数」をプログラムすればよいということです。これを支えているのが例のカリー・ハワードの同型対応。
私はあまりAgdaのバグに出会ったことはないけど、単にあまり複雑なことを試してないだけかも(汗

あと、IDEのスクリーンショットは単に対話的に証明しようとしてるだけで、コンピュータに全部証明させようとしているのではないのでは?

P.S.
リンク先は
http://www.tom.sfc.keio.ac.jp/~sakai/d/?year=2005;category=agda
だと2005年の分しか表示されないので、
http://www.tom.sfc.keio.ac.jp/~sakai/d/?category=agda
の方が良いかも。

> さかい さん

うわぁ,さかい さんが挫折したようなものに手を出してしまったのですか… orz

# 私なんかには無謀すぎる… o...........rz

Mr.有言不実行なので (苦笑) あまり期待しないでください… (^^;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

>> カリー・ハワードの同型対応。

私は Prolog のような,推論ルールによるルール型のプログラミングの方に馴染みがありますが,関数型の人の方が現在は主流なので,どちらのスタイルでも書けるというのはありがたいですよね.

ML も,定理証明器の一種で,高階論理を記述するために,厳格に型付けを行うようになった論理型言語の一変種,と考えた方が,私にとってはとっつきやすいです (^-^)

>> 私はあまりAgdaのバグに出会ったことはない

ソフトウェアは日進月歩ですからね.両方の品質が上がって,使いやすいスタイルの方を選べるというのは,とても良いことだと思います.

# あまり無雑作に,こういう FUD を流すのは,良くないことですね.すみませんでした…

>> IDEのスクリーンショットは単に対話的に証明しようとしてるだけ

すみません,これはネタのつもりで書いたのです (^-^;)

でも,対話的にでも証明できたら,エライことのような気がします (笑)

# だんだんと,数学者も,定理証明器を使うようになっていくのでしょうかねぇ.人間が 1 ステップづつ証明を追いながら検証していくよりも厳密ですからね.あのフェルマーの証明も,最初は,誰も穴に気がつかなかったらしいですし (コンピュータが検証できるレベルにまで抽象概念を落すのは,非現実的なのかもしれませんが).

# そうすると,構成的証明とプログラミングの区別が限りなくあいまいになってきて,数学科卒のプログラマという経歴が,珍しくなくなってくるかもしれませんね.とか妄想.

>> P.S.

あ,ほんとですね.修正しておきました ! 御指摘感謝です.

>現在の数学者でも,やっぱり紙とペンだけでがんばっているのでしょうか ?

数式処理系は結構使われていると思います。

とはいえ、数学の難しいところは証明の正しさをチェックするところではなくて(これも十分難しいですが)アイディアを思いつくところで、この段階ではイメージが大事ですから、数学者が使うのは当面紙とペンだと思います。そもそもアイディアを理解せずに機械的に論証を追っても間違えそうですし。(証明検証系を使っても、ステートメント自体を間違えるたり)

数理論理学だと、何とかと言う定理は体系Xで証明できて...という議論を何度もするのですが、体系X内の論証を書き下すのは実際無理なので、こういう主張をするたびに胃が痛くなります。(ゲーデルが第2不完全性定理の証明を出版しなかったのもこれが理由だそうで)このあたりをやってくれると助かるのですが...

> yoriyuki さん

うわぁ,コメント欄が,なんだかやたら豪華ですね.感激です.コメントありがとうございます !

>> 数式処理系は結構使われていると思います。

ほほう,なるほど.将棋の世界と同じように,徐々に数学界も世代交替が進んでいるみたいですね.

# 昔は,多くの数学者はコンピュータを軽蔑していたような気がします.

>> 数学の難しいところは証明の正しさをチェックするところではなくてアイディアを思いつくところ

ああ,ちょっと考えてみれば,あたりまえの話でしたね.すみません
(⌒〜⌒ι)

>> アイディアを理解せずに機械的に論証を追っても間違えそう

ここ (「直感」「洞察」の有無) が,チューリングマシンと数学者の,もっとも根本的な相異点ですよね.

# AI 屋なので,数学者の「洞察」や「直感」が,どのような「アルゴリズム」で生まれているのか ? という点には,興味が付きません.

数学的経験
http://www.amazon.co.jp/exec/obidos/ASIN/4627052103/503-4132332-2535139

>> 体系X内の論証を書き下すのは実際無理

これはつまり,高々数個〜十数個の公理だけを使用して,論証を実際に書き下すのは,証明が異常に長大になるので,原理的には可能でも,現実的には不可能,という意味でしょうか ?

# たとえば,ラッセルとホワイトヘッドの「数学原理 (プリンキピア・マセマティカ)」 では,1 + 1 = 2 の証明に,360 頁以上の紙面を割いたと聞きます…

すなわち,(私は計算機屋なので) 計算機の言葉で書くと,体系 (CPU) と公理 (組み込みの機械語) 間の移植性が問題だと.

もし,ある CPU (公理系) には,別の CPU にある命令 (公理) が無かったとしたら,ソースコード (論証の証明) を移植するためには,その命令をエミュレート (再証明) しなければなりませんよね.

証明が上手く階層化されていれば,最小限の手間で移植はできそうですが… CISC (通常の数学) の公理を,RISC (数学基礎論) の,非常にプリミティブな公理に落すのは,よっぽとコンパイラが優秀じゃないとなかなか大変ですよね.

>> このあたりをやってくれると助かるのですが...

任意の証明 (ソースコード) を,任意の公理系の公理の集合 (機械語) まで還元してくれるような定理証明系 (コンパイラ) があれば良いのですがね… (^^;

# 数学は,極めて抽象的ですが,一応人工言語なので,技術的には可能そうですが…

>あろはさん

> 私はもともと関数型言語全然わかりませんから… (^^;

そこで、日経ソフトウェア6月号の「Haskellによる関数型言語入門」ですよ。と、勝手に宣伝してみます(^^;

> 私は Prolog のような,推論ルールによるルール型のプログラミングの方に馴染みがありますが,関数型の人の方が現在は主流なので,どちらのスタイルでも書けるというのはありがたいですよね.

以前にsinさんと議論したときにも思いましたが、カリー・ハワードの同型対応について何か誤解しているような気がします。カリー・ハワードの同型対応に着目すると、関数型言語とは「証明の*簡約(=カット除去=正規化)*を計算とみなすパラダイム」に基づいた言語と言えます。それに対して、Prologのような論理型言語は「証明の*探索*を計算とみなすパラダイム」に基づいた言語(ですよね?)。たまたま論理や証明に関係するだけで、両者には明確な違いがあると思います。

「推論ルールによるルール型のプログラミング」がどの程度の範囲を指しているのかは良く分かりませんが、Agdaは少なくとも論理型言語のように使うことは出来ないですよ。

> そうすると,構成的証明とプログラミングの区別が限りなくあいまいになってきて

元からそんな区別なんか存在しません! とか言ってみる(笑

> yoriyukiさん

> 数式処理系は結構使われていると思います。

そういや、うちの学校の数学の先生もMathematicaとかは結構普通に使ってました。

> さかい さん

>> 両者には明確な違いがある

もちろん「関数型プログラミング」 自体が,「論理型プログラミング」と,直接対応するとは,考えていません.書き方が悪かったです (^^;

# ◯◯型プログラミング,という用語自体が,あいまいで誤解を招きやすいですが… 便利なことばなので,ついつい安易に使ってしまいます.

以下のような,関数型プログラミングの一部

・ 型体系と型推論

型体系の推論規則を用いて,与えられたプログラムに対して,ちゃんと整合性がとれた型付けができるか.

が,

・ 論理型プログラミング

論理体系の推論規則を用いて,与えられたゴール (質問) を証明できるか.

と対応する,という認識でした.

>> Agdaは少なくとも論理型言語のように使うことは出来ないですよ。

そうですね, Coq も,なんだか思っていたよりも関数型言語っぽいです.

後半には,Logic Programming という用語が出て来るようなので,とりあえず少しづつ慣れて行くつもりです.

その過程で,様々な誤解も解けて行くのではないかと.

>> 日経ソフトウェア6月号の「Haskellによる関数型言語入門」

ぜひ読ませていただきます !

>> 元からそんな区別なんか存在しません! とか言ってみる(笑

さすがさかいさんだ,俺たちには言えないセリフを平然と言ってのけるッ!

そこにシビれる ! あこがれるゥ !! (笑)

>> さかい さん

>> 日経ソフトウェア6月号

今日,三軒ほど書店を回ってみたのですが,どこもまだ 5 月号しか売ってませんでした… orz

北海道は,本州よりも時間の流れが遅いようです… (*´-ェ-)
プロフィール
  • Author:あろは (alohakun)
  • 京都のデバッガベンダーに勤めるアラサー会社員。

    本ブログの内容は,あくまでも個人的な感想や意見であり,会社の意見を代表するものでは一切ありません.

    連絡先 : alohakun ___at___ gmail.com
    mixi : http://mixi.jp/show_friend.pl?id=182927
    twitter : http://twitter.com/alohakun













    あわせて読みたい


    この日記のはてなブックマーク数


    スカウター : ホワット・ア・ワンダフル・ワールド


    Map
FC2カウンター
ブロとも申請フォーム

この人とブロともになる

最近のコメント
リンク
最近のトラックバック
人生の残り日数
日本人男性の平均寿命は 28700日.
RSSフィード
カテゴリー
  1. RSSリーダー