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

The Coq Proof Assistant A Tutorial (2) 定義

前回の続きです.

今回は,定義についてです.

coq-interface の初期化の際に読みこまれるプレリュードは,いくつか数学的定義を含んでいます.

例えば,前回扱った nat は,数学的概念 (mathematical collection) (Set 型) として定義されています.また,定数 O (オー) や S,plus なども,それぞれ nat,nat -> nat,nat -> nat -> nat という型のオブジェクトとして定義が用意されています.

では,O と S を用いて,自然数を定義してみましょう.ここでは,一番最初の自然数 O と,次の自然数を求める関数 S の存在を前堤とします.

1 は,どのように定義すれば良いでしょう ? そうです,1 は O の次の数ですね.


$ coq-interface
Welcome to Coq 8.0pl3 (Jan 2006)

Coq < Section Declaration.

Coq < Definition one := (S O).
one is defined

Coq < Check O.
0
: nat

Coq < Check S.
S
: nat -> nat

Coq < Check one.
one
: nat


1 が定義されたら,それを使って 2 を定義することができます.1 の時は型は省略しましたが,もちろん型を明示しても OK です.ちなみに,一度した宣言を取り消すには,Reset を使います.

Coq < Definition two := S one.
two is defined

Coq < Definition two : nat := S one.
User error: two already exists

Coq < Reset two.

Coq < Definition two : nat := S one.
two is defined

Coq < Definition three := S two.
three is defined

plus を使用して,与えられた数を 2 倍する double を定義してみましょう.

Coq < Definition double (m:nat) := plus m m.
double is defined

与えられた引数だけではなく,自由変数 (グローバル変数) にアクセスするような関数を定義することもできます.

Coq < Variable n : nat.
n is assume

Coq < Definition add_n (m:nat) := plus m n.
add_n is defined

変数は,量化限定することができます.


Coq < Check (forall m:nat, gt m 0).
forall m : nat, m > 0
: Prop

Coq < Check (exists m:nat, gt m 0).
exists m : nat, m > 0
: Prop


これにより,「全ての (全称 ; forall ; ∀) 〜 は P」「少なくとも一つ P であるような 〜 が存在する (存在 ; exists ; ∃)」のような状況を表現することができるようになります.これは,後々述語論理に入ると重要になってくる考え方です.

# ちなみに,量化は,今でこそ常識になっていますが,実はこれは長年多くの論理学者を悩ませ続けてきた超難問だったのです.

# 20 世紀に入って,ようやくフレーゲの量化理論によりこの難問がエレガントに解決された後,アリストテレス以来 2000 年もの間停滞していた論理学は劇的な発展を遂げ,やがて計算機の発明へとドラマティックにつながっていくことになります.

量化限定子を用いることにより,自然言語ではうまく表現できないような,より複雑な状況を,完全に明示的に厳密に記述できるようになります.

# 私は,未だに∃と∀が組合わさった論理式を見ると,どっちがどっちにかかっているのかとっさにわからず,混乱してしまいます (^^;

# またまた完全に余談ですけど,論理プログラミングでは,最初から論理式を計算機に処理させやすい形にエンコードしてから与えているので,量化記号などは出てこない場合が多いです.

# 例えば Prolog などでは,「節 (ホーン節)」という型式に変型された論理式を扱いますが,これは全ての変数が全称量化されているので,明示的には量化記号がでてきません.論理式から存在量化を取り除いて,全ての量化記号が頭のところにきた冠頭連言標準型に変換するためには,スコーレム化とか,いろいろややこしいアルゴリズムを用いた後,ド・モルガン則などを駆使する必要があって,なかなか大変.

次回からは,いよいよ Coq の本体,証明機構 (推論エンジン) を使用して行きます.

debian GNU/Linux で coq のインストールが途中で失敗した件について (解決)

以下が,エラーログ.

# apt-get install coq
...

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
提案パッケージ:
ocaml-nox proofgeneral-coq ledit cle
推奨パッケージ:
coqide
以下のパッケージが新たにインストールされます:
coq
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 4 個。
6112kB 中 0B のアーカイブを取得する必要があります。
展開後に追加で 21.8MB のディスク容量が消費されます。
未選択パッケージ coq を選択しています。
(データベースを読み込んでいます ... 現在 126294 個のファイルとディレクトリがインストールされています。)
(.../archives/coq_8.0pl3-2_i386.deb から) coq を展開しています...
coq (8.0pl3-2) を設定しています ...
install/coq: Handling install for emacsen flavor emacs20
Opening input file: no such file or directory, /usr/lib/X11/locale/locale.alias
emacs-package-install: /usr/lib/emacsen-common/packages/install/coq emacs20 emacs20 emacs21 failed at /usr/lib/emacsen-common/emacs-package-install line 30, line 1.
dpkg: coq の処理中にエラーが発生しました (--configure):
サブプロセス post-installation script はエラー終了ステータス 255 を返しました
以下のパッケージの処理中にエラーが発生しました:
coq
E: Sub-process /usr/bin/dpkg returned an error code (1)


最初は,またいつもと同じように,パッケージがインストールの途中で壊れたのだろうと思ったのですが,別の場所からパッケージを拾って来て dpkg -i しても,同じエラーが.

ていうか,よく見れば,思いっきりまんまエラー原因が書いてあるじゃないか ! (よく読め < 自分)

install/coq: Handling install for emacsen flavor emacs20
Opening input file: no such file or directory, /usr/lib/X11/locale/locale.alias

というわけで,テキトーにシンボリックリンクを作って再設定してみたら無事解決.

# locate locale.alias
/etc/locale.alias
/usr/share/gettext/intl/locale.alias
/usr/share/locale/locale.alias
/usr/share/X11/locale/locale.alias

# ln -s /usr/share/X11/locale/locale.alias /usr/lib/X11/locale/

# apt-get -f install

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 4 個。
1 個のパッケージが完全にインストールまたは削除されていません。
0B のアーカイブを取得する必要があります。
展開後に追加で 0B のディスク容量が消費されます。
coq (8.0pl3-2) を設定しています ...
install/coq: Handling install for emacsen flavor emacs20
Loading 00debian-vars...
Loading 20apel...
Loading 42hyperlatex...
Loading 50autoconf...
Loading 50coq (source)...
Loading 50devhelp (source)...
Loading 50dictionaries-common (compiled; note, source file is newer)...
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...
Loading 50egg-init (source)...
Loading 50gettext...
Loading 50global (source)...
Loading 50mit-scheme (compiled; note, source file is newer)...
Loading 50namazu2 (source)...
Loading 50nowebm...
Loading 50psvn (source)...
Loading 50sdic...
Loading 50w3m-el...
Loading 50yatex-init...
Loading 50yc-el (source)...
Loading yc...
Loading 70sdic-edict (compiled; note, source file is newer)...
Loading 70sdic-gene95 (compiled; note, source file is newer)...
Wrote /usr/share/emacs20/site-lisp/coq/coq-inferior.elc
Wrote /usr/share/emacs20/site-lisp/coq/coq.elc
Done
install/coq: Handling install for emacsen flavor emacs21
Loading 00debian-vars...
Loading 20apel...
Loading 42hyperlatex...
Loading /usr/lib/emacs/21.4/i486-linux-gnu/fns-21.4.1-x.el (source)...
Loading 50autoconf...
Loading 50coq (source)...
Loading 50devhelp (source)...
Loading 50dictionaries-common (compiled; note, source file is newer)...
Loading /var/cache/dictionaries-common/emacsen-ispell-dicts.el (source)...
Loading /var/cache/dictionaries-common/emacsen-ispell-default.el (source)...
Loading 50egg-init (source)...
Loading 50gettext...
Loading 50global (source)...
Loading 50mit-scheme (compiled; note, source file is newer)...
Loading 50namazu2 (source)...
Loading 50nowebm...
Loading 50psvn (source)...
Loading 50sdic...
Loading 50w3m-el...
Loading 50yatex-init...
Loading 50yc-el (source)...
Loading yc...
Loading 70sdic-edict (compiled; note, source file is newer)...
Loading 70sdic-gene95 (compiled; note, source file is newer)...
Wrote /usr/share/emacs21/site-lisp/coq/coq-inferior.elc
Wrote /usr/share/emacs21/site-lisp/coq/coq.elc
Done

別に emacs で coq を使おうとは思っていないので,elisp の方はどうでも良いんですよね.ちなみに私は Vimer.emacs は使っていると小指がつりそうになる (特に,小指の付け根で Ctrl を押せない Note PC や,Ctrl が Fn になっているキーボードでは最悪) ので.Vim にくらべると,全体的にタイプ量が多すぎですから.
# というか,単にもう,Vim 以外のエディタが使えない… 普通のエディタを使っているときでも Ctrl-[ (ESC) とか : をついつい押してしまいます… (^^;

aloha:~# apt-get install coqide
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
以下のパッケージが新たにインストールされます:
coqide
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 4 個。
3442kB 中 0B のアーカイブを取得する必要があります。
展開後に追加で 12.4MB のディスク容量が消費されます。
未選択パッケージ coqide を選択しています。
(データベースを読み込んでいます ... 現在 126334 個のファイルとディレクトリがインストールされています。)
(.../coqide_8.0pl3-2_i386.deb から) coqide を展開しています...
coqide (8.0pl3-2) を設定しています ...

無事終了.

今回は大丈夫でしたけど,バイナリベースのディストリは,どうしてもトリビアルなところの依存関係までもが深くなりまくりで,たまに困ります.よけいなものをインストールしようとして,そこでコケられたら,目も当てられません.ちょっと大きなパッケージをインストールすると,膨大な量の関連パッケージがいつのまにかインストールされがちなので,どんどん依存関係が複雑化.

現在 13 万近いパッケージが… ここまでくると,むしろ apt-get が正常に動いていること自体に驚嘆.中の人達スゴイなぁ.

まぁ,何はともあれ,これで Linux でも Coq れるぜ !
プロフィール
  • 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リーダー