関数の定義、型の定義
Coqでは関数や型を定義するための簡単なコマンドが三つある。
Definition, Fixpoint, Inductiveである。
Definitionについて
CoqではDefinitionコマンドを使って関数を定義することができる。
Coq < Definition f x := x+1. f is defined
OCamlの「let 〜;;」のようなものと思えばわかりやすいだろう。
文法 [Definition 変数名 := 値.]
もちろんポリモルフィックな関数も定義できる。ポリモルフィックよりもっともっと複雑な関数も定義できるが、難しいのでここでは触れない。ただ、その圧倒的な表現力のために関数型言語などの普通のプログラムにあるような型推論がCoqでは失われる。
Coq < Variable A : Set. Coq < Variable B : Set. Coq < Variable C : Set. Coq < Definition composit (f:A->B)(g:B->C)(x:A) : C := g (f x). composit is defined
Fixpointについて
OCamlでは再帰関数を宣言するときに「let rec」というキーワードを使う。
Coqでそれに対応するのがFixpointだ。
試しに 0 から n までの和を計算する関数を定義してみよう。
Coq < Fixpoint sum (n:nat) : nat := Coq < match n with Coq < | O => O Coq < | S p => n + sum p Coq < end. sum is recursively defined
(余談:Coqのマッチ文はOCamlのそれとよく似ているが、最後にendと必ず書くことに注意しよう。これによってmatch文が入れ子になるときの記述を楽にしてくれる。)
Inductiveについて
OCamlで型を宣言するときは「type」を使うが、CoqではInductiveというコマンドに対応する。この宣言によって定義される型をInductiveな型というが、OCamlを知っている人は普通の型のことと思えばよい。
Inductiveな型、リストを定義する。
Coq < Inductive list (A:Set) : Set := Coq < | nil : list A Coq < | cons : A -> list A -> list A. list is defined list_rect is defined list_ind is defined list_rec is defined
Inductiveな型を定義すると、自動的にそれにまつわる便利な補題などが自動的に生成される。