まずは
いきなりCoqで定理の証明をするのではなく、まずはいじってみます。 ではCoqを起動してみましょう。(今回はCoqIdeではなく、Coqの方にしましょう。)
Welcome to Coq 8.1pl3 (Dec. 2007) Coq < |
コマンドプロンプトのような窓がでて、その中に上記のような文字が表示されていることと思います(数字は多少違うかも)。
その中の Coq <のことをCoqの プロンプト(単にプロンプト)と呼ぶことにします。但し、 < の前にある Coqの部分は、 状況に応じて変化しますので、そのときはびっくりしないでください。
さて、インストールしたばかりのCoqでも自然数は理解しているはずです。 Checkコマンドで確認してみましょう。(Coqは大文字と小文字を区別しますので注意 してください。また、他の場所でコピーした文字列をCoqに貼り付けることができ ます。Coqの窓の一番上のバー(左端にCoqと文字がある)を右クリックして、編集->貼り付けを選べば貼り付けることができます。)
Welcome to Coq 8.1pl3 (Dec. 2007) Coq < Check 3.<Enter> 3 : nat Coq < |
Check 3. の最後のピリオドは忘れないでください。Coqでは、命令の最後に必ずピリオドを 打たなくてはなりません。また、<Enter> の部分は、Enterキーを押すことを表したもので、皆さんの実際の画面には表示され ないはずです。(以後面倒なので、この<Enter>は、 なるべく表示しないで済ますことにします。)
さて、命令Check 3.に対してCoqの出力は
3 : nat |
と出ています。途中で改行が入っていますが、これは普通 3 : nat と表記します。 これは「3の型はnatである」とか「3はnat型である」とか、「3は型natを持っている」 などと読みます。そして、このnat型というのは、Coqの中で自然数を扱うための 型です。結局、Checkコマンドと言うのは型を確認する コマンドなのです。
Coqは十進法を理解しているので、「3」なる表記が使えますが、本当の姿は違います。Coqでの「3」の本当の姿を見てみましょう。それにはUnset Printing Notations.なる命令を使います。(その命令を元に戻すにはSet Printing Notations.なる命令を使います。)
Welcome to Coq 8.1pl3 (Dec. 2007) Coq < Check 3. 3 : nat Coq < Unset Printing Notations. Coq < Check 3. S (S (S O)) : nat Coq < Check 4. S (S (S (S O))) : nat Coq < Check 0. O : nat Coq < Set Printing Notations. Coq < Check 3. 3 : nat Coq < Check 0. 0 : nat Coq < |
上記のUnset Printing Notations.の直後のCheck 3.に対するCoqの出力を見ると、 「3」の本当の姿は「S (S (S O))」であることがわかります。また、「0」(数字の ゼロ)の本当の姿は「O」(アルファベットの大文字のオー)であることにも注意 してください。
せっかく自然数を扱ったので、Coqに計算もさせてみましょう。
Coq < Eval compute in ((5 - 1) * 7). = 28 : nat Coq < Eval compute in (5 - 8). = 0 : nat Coq < |
Coqでは、掛け算の記号は「*」を使います。また、今のCoqの状態ではCoqは自然数は理解していても整数は理解していないはずです。つまり、負の数を理解していません。上記の「5 - 8」の計算はエラーにしてもいいのでしょうが、Coqでは「小さい自然数 引く 大きい自然数」は0にしてしまうようです。(というか、帰納的関数ではあたりまえ?)