前置き

もう一度言いますが、はじめにでも述べているよう に、このサイトの製作者(算散士)は 型理論をあまりよく知りません。 ですから、本格的に知りたい人は他をあたった方がいいと思います。

型のないλ式

いきなり型の付いたλ式を説明すると、初めての人は複雑に見えるかもしれない ので、まずは型のないλ式の定義を述べようと思います。以下の1.2.3.は

高橋正子 「計算論」 近代科学社

のp.63の定義2.1.1です。

  1. 変数、x, x, ...はλ式である。
  2. Mがλ式で、xが変数のとき (λx.M) はλ式である。
  3. MとNがλ式のとき (MN) はλ式である。

そして、上記の1.2.3.のみによって作られる式を(型のない)λ式と 呼びます。また、2.における (λx.M) を x に関する M の関数抽象 (functional abstraction)と呼び、3.における (MN) を M の N に対する 関数適用(functional applicatoin)と呼びます。 これらの言葉を使うなら、(型のない)λ式というのは、変数に関数抽象と関数適用を 繰り返し行うことによって得られる式ということになります。

あと、上記の定義でそのままλ式を書くと、括弧が多すぎて大変見づらくなる ので、次のような略記法を用います。

  1. 一番外側の括弧は省略する。
  2. (λx.(λx.(・・・(λx.M)・・・)))は λx・・・x.Mと略す。
  3. ((・・・((M)M)・・・)M)はM・・・Mと略す。
  4. 関数適用の結合力よりも、関数抽象の結合力の方が弱いものとする。つまり、 λx.Mと書いたときは、 (λx.M)Mではなく、 λx.(M)を意味するものとする。

以上の定義から最初に思ってほしいのは、「λ式というのは何らかのルールに 沿った単なる文字列なんだな」ということです。

λ式を単なる文字列という目で見ることはとても大事なので決して忘れない でください。ですが、それだけではアルファ同値 とか、ベータ変換(ベータ簡約?)等の気持ちがわからなくなるので、 λ式の気持ちも説明しておこうと思います。

λ式の気持ちをわかりやすく説明するために、上記の1.2.3.から外れた式 も使用したいと思います。 高校までの数学では、x+3などの式で、xの関数を表現したり します。しかしこれが、x+x・yのような式になると、 xの関数なのか、yの関数なのか、それとも関数の値なのか、そのままでは区別が つかなくなります。そこで、x+x・yをxの関数として 見るときは(λx.x+x・y)と書き、yの関数として見るときは (λy.x+x・y)と書くことにするのです。 これが、上記2.の記法の気持ちです。

次は3.です。f を(引数が)xの1変数関数とするときに、関数 f の引数xに 4を代入した値を f(4) などと表記します。これを括弧をはずし、単に並べ て f4 と書く。 これが上記3.の記法の気持ちです。すぐ上で説明した2.の気持ちと あわせて具体例を示しましょう。
f を(λx.x+3)とするなら、

  1.    f4=(λx.x+3)4=4+3=19

です。

すると、λ式の記法の仕方では1変数しか表現できないように思えるかもしれません が、そうではありません。次の具体例を見てください。

  1.    ((λx.(λy.x+x・y))3)4=(λy.3+3・y)4=3+3・4=9+12=21

これはx+x・yをxとyの2変数関数と見て、x=3、y=4を 代入した計算になっています。一般的に、 M・・・Mと書いた 場合、気持ち的にはMのみが関数で、残りの M、M、・・・、Mは関数M に代入されるものなのです。

実は、上記の1.2.3.で定義されたλ式に、上記の計算例a.b.のような 書き換えをすることをベータ変換といいます。具体的には、

  1.    (λx.xy)(λx.x)=(λx.x)y=y

です。これを使ってアルファ同値について説明しましょう。λx.xyを上記で 説明した気持ちで解釈すると、xの関数になっているわけですが、 関数という機能に着目した場合、λx.xyにおける文字xは、代入する場所を教える 役割しかありません。つまり、文字xをzに変えても、 上記の計算(ベータ変換)の結果は同じになります。やって見ましょう。

  1.    (λz.zy)(λx.x)=(λx.x)y=y

そこで、λx.xyにおける文字xのような文字を束縛変数と呼び、束縛変数 だけが違うλ式は、アルファ同値といって、同じλ式であるとみなすのです。 ですから、λx.xyなるλ式を、何かの都合でλz.zyに書き換えるというよう なことは頻繁に行います。(結局、λ式における束縛変数というのは、上記2.に おいて、λで指定される変数のことです。)

ただし、λx.xyにおける文字xをyに変えることはアルファ同値とは言い ません。もしそれをおこなうと、λx.xyはλy.yyになってしまうわけ ですが、それでは上記の計算の結果が変わってしまいます。やってみましょう。

  1.    (λy.yy)(λx.x)=(λx.x)(λx.x)=λx.x

つまり、λ記号で指定されている文字を変更しても、関数としての機能が同じ 場合なら、アルファ同値とするのです。

さらに、束縛変数でない変数は、自由変数と呼びます。少し具体例を示しましょう。

  1.    (λxy.xz(yz))(λz.z(λy.xyz))

上記 g. のλ式において、文字xは3箇所に現れていますが、左から1番目と2番目の xは束縛変数ですが、一番右の変数xは自由変数です。このように、 同じ文字でも場所によって束縛変数だったり、自由変数だったりします。そこで、 「左から1番目と2番目のxは束縛されているが、一番右の変数xは自由 である」というような言い方もします。他の文字y、zに関しては、yはすべて 束縛されていますし、zは場所によって束縛されているのと自由な ものがあります。(ちなみに、右から1,2,3番目のzが束縛されています。)

以上のことは精密に定義しようとすると、たいしたことではないのに読むのが 苦痛になるような長い定義になるので、これくらいで勘弁してください。 また、このサイトでCoqで遊ぶ上では、上記のベータ変換よりも、アルファ同値の方 を頭に入れて置いてください。というのも、Coqは証明の段階で、 よく勝手に束縛変数の書き換えをするからです。

もどる