Coq 記号
変数/関数定義
Definition 名前 (:型) := 定義. (* 最後ピリオド *)
Definition three : nat := 3. Definition three' := 3.
:= で定義。
- 型は省略出来る。(型推論が効く場合)
- 引数のない関数か、単なる定数の区別が私には出来ません。どっかで出来るの?
- Definitionの代わりにParameterだと、定義(:=以降)が出来ないのか。どんな風に使うのかは不明。
関数ぽいもの
Definition 名前 引数リスト(:型) (: 戻り値の型) := 定義
Definition f (x: nat) : nat := 3 * x + 1. Definition f' (x : nat) := 3 * x + 1 Definition f'' : forall (n:nat), nat := fun (x :nat) => 3 * x + 1. Definition f''' : nat -> nat := fun (x : nat) => 3 * x + 1.
- 例によって型は省略出来る。
- natは0を含む自然数を表すCoqの組込み型。
- forall 。。 は。。型の引数を取る関数の糖衣構文だったっけ。それとも逆で、関数の方がforallの糖衣構文だったっけ。
hoge -> huga
=> で関数の本体を定義。=>はパターンマッチでも使うけど、パターンマッチも関数定義みたいなもんなんだろうか?
無名関数は上記の通り
fun 引数リスト(:型) => 本体
引数リストは同じ型なら纏めて書くことが出来る。
fun x y :nat => x + y.
複数の引数を型付きで書くなら括弧が必要になるようだ
fun (X : Type) (x : X) =>...
fun X : Type x : X => ... (* これはエラー *)
一時変数はlet。他の言語でもよく見掛ける気がする。
Eval compute let x : nat := 3 in x * x.
よく似た記号がいきなり色々出て来るので混乱する。
改めて読んでやっと理解した。すぐ忘れそうな気もするけど。