前置き
ここでも言いますが、はじめにでも述べているように、このサイトの製作者(算散士)は 型理論をあまりよく知りません。 ですから、本格的に知りたい人は他をあたった方がいいと思います。
型付きλ式
さて、ここで型付きλ式の厳密な定義...と行きたいところなのですが、結局は 私自身よくわかっていません。λ-cubeあたりまでは、あたってみたのですが、Coqは CC(Calculus of Constractions)とも違って CIC(Calculus of Inductive Constructions)というらしく、今、リファレンス マニュアルやCoq'Artに一生懸命アタックしているところです。 (もっとわかりやすい文献ありましたら、どうか こちらにでも情報提供よろしくお願い致します。)
それに、今ここで必要なのは、Print命令で表示されるλ式から証明を読み取る ことができればいいだけなので、とりあえずはそれに必要な説明だけをここで試み ようと思います。
では、型付きλ式を大雑把に説明しましょう。とてもとても大雑把に 言うなら、型のないλ式の各変数に型を付け加えたもの、ということになるで しょうか。 型のないλ式のページの1.2.3.に対応して、 もう少し表記や型の付き方について詳しく言うと、
上記1.2.3.のイメージをお話しましょう。 型付きλ式Mが型Aを持っている場合、 M:A と表記しますので、 以下その表記を使います。
ここではイメージというより、x:Aなる表記の別の見方を紹介します。 それは集合のような見方です。x:Aと表記したとき、これはxが型Aを持つ という意味なのですが、もし、型Aを持つもの全てを集めた集合もAで表記 するなら、x:Aは、「xは集合Aの要素である」とも読めます。以下、このような 見方もしますので覚えておいてください。
(λx:A.M) は、型のないλ式のときと同様、(型がAである)変数x を引数とする関数のイメージです。一般には、 M も B も自由変数としてxを含 んでいますので、それを強調するために、 M(x)、B(x) と表記して もう一度復習してみましょう。M(x) の型は B(x) ですから、
と表記され、これをxの関数としてみた (λx:A.M(x)) の 型は Πx:A.B(x) なので、
と表記されます。ということで、上記b.のイメージを言葉で言うと
です。ここで、たまたま型 B が自由変数xを持っていなかった場合を考えま しょう。つまり、型 B がxに依存しないわけです。この場合に上記c.を 考えてみると、まるで、「集合A(というより、型Aであるものを全て集めた集合) から集合B(型Bであるものを全て集めた集合)への関数(写像)」を述べている ように見えます。それで、この場合に限り、上記b.は
と略記されます。つまり、 (λx:A.M(x)) は A から B への 関数である、というわけです。逆に、b.はd.を少し一般化したもの、という 見方をすると少しわかりやすいかもしれません。(集合と写像の知識のない人は、 たまたま型 B が自由変数xを持っていない場合は、d.のように略記するという ことだけ覚えておいてください。)
ここで、上記の1.と2.のイメージ をあわせて、f:A→Bを読み取ってみましょう。 もちろんこれは「fは型A→Bを持つ」と読むことができます。さて、1.で 話したように、A→Bは、型A→Bを持つもの全体の集合とも読むことにします。 そして型A→Bとは、AからBへの関数(写像)を表す型ですから、結局、 A→Bは、AからBへの関数(写像)全体の集合ということになります。 再び1.のイメージの説明を思い出してf:A→Bを読み取ると、 「fはAからBへの関数(写像)全体の集合の要素である」つまり、 「fはAからBへの関数(写像)である」ということになります。
まったく同様にg:A→(B→C)を読み取るとどうでしょう。今の段階では 「gはAからB→C(BからCへの関数全体の集合)への関数である」としか 言えませんが、いずれ2変数関数とみなせる話をします。
今度は、Mが型Πx:A.Bの型付きλ式ですから、Mは
のような形をしているはずです。つまり M は、(また、B も B(x) のように 表記します。)
というイメージを持った型付きλ式です。そして、(MN)は 型のないλ式のページの3.とまったく同様な イメージで、
というイメージのものです。とすれば、(MN)の型は当然
になります。これは B(N) と書き表してもいいでしょうし、上記3. では B[x:=N] と表記しました。
ちなみに、 B が自由変数xを持っていない場合、(このとき、 M の型 は A→B と略記されますが、) B[x:=N] は B とまったく同じに なります。(B の中に代入すべき場所がないからです。)
ちょっと論理
上記3.の M:(Πx:A.B) において、型Bが自由なxを持っていない 場合、 M:(A→B) となるわけですが、これと N:A から、 (MN):B を 作る様子を次のように図にして見ましょう。
M:(A→B) |
N:A |
------------------------ |
|
(MN):B |
上記 i. の、型のところだけ見てください。A→B と A から B を 導いています。これは論理の、いわゆるmodus ponensと呼ばれる推論 です。このように、 型付きλ式の構成は、推論の積み重ねにも見ることができるのです。
Coqでの表記
Coqでは、型付きのλ式の関数抽象の部分が少し違った表記になります。 つまり、 (λx:A.M) なるλ式は
fun (x:A) => M
と表記されます。また、省略形と して、 (λx:A.(λy:B.M)) なるλ式は
fun (x:A) (y:B) => M
と表記されます。さらに型 A と型 B が同じときは
fun (x y:A) => M
と表記されます。
また、変数xの型が A のとき、原則として x:A と 表記するのですが、他の部分で既に x:A なる表記があって、繰り返し 型を表示する必要のないときは、単にxと表記されます。
さらに、型の Πx:A.B のCoqでの表記は
forall x:A,B
となります。AとBの間にあるのは「,」(コンマ)なので気をつけて
ください。
また、λ式のときと同様、省略形として、
(Πx:A.(Πy:B.C)) なる型は
forall (x:A) (y:B),C
と表記されます。さらに型 A と型 B が同じときは
forall x y:A,C
と表記されます。
結局、上記b.の(λx:A.M(x)):(Πx:A.B(x))は、Coqの表記 の仕方では
(fun (x:A) => M(x)):(forall x:A,B(x))
となります。
1変数関数と多変数関数の型
また、ふつうのλ式の記法で話を続けます。 型のないλ式で、 2変数の話をしました。 そこで言いたかったのは、λ式の記法では1変数の関数の表現方法しか定義されて いないのに、工夫によって多変数もあつかうことができるということでした。 もちろん、型付のλ式においても同様な工夫ができます。
多変数であれば同様なので、2変数で話を続けます。さて、2変数ですから、 例えば Aの要素aと、Bの要素bを与えると、Cの要素がただひとつ定まる関数gを 今までの方法で表現してみましょう。それは上記でも軽く触れた g:A→(B→C)です。次を見てください。(上記「 1.のイメージ」の説明に従うと、「Aの要素a」などと 言うときは、「a:A」と表記すれば事足りる。)
つまり、g:A→(B→C)を使えば、a:Aとb:Bからgab:Cを 作れるわけです。集合論の書き方に従えば、gはg:A×B→Cとなり、gabは g(a,b)となるでしょうか。
同様に、A、B、Cの各要素を与えるとDの要素が定まる3変数関数hの 型は、h:A→(B→(C→D))となります。「→」が右に結合的であること から、h:A→B→C→Dと括弧を省略することもできます。