λ計算とは、チャーチにより定義された、実行可能なアルゴリズムを記述するための言語。記述できるアルゴリズムはチューリングマシンと同じであるが、計算の過程が式変形として定義されているため、より宣言的にアルゴリズムを記述できる。Lisp, ML, Haskellといった関数型言語のもととなった。
まず無限個の変数が与えられているとする。変数は通常x, yなどど記述される。変数から出発し、次の操作を繰り返して得られるものをλ式と呼ぶ。
またλ抽象や関数適用の範囲を明確にするために括弧を用いる。
例: (λx. xx)(λx. xx),λf.(λx.(f (x x)) λx.(f (x x)))
M[N/x]はMに含まれる束縛されていない変数xをλ式Nで置き換えたものとする。
厳密に言うと、β変換では、Mの中でλ抽象されている変数名を付け替えて、Nに含まれる変数をMのλ抽象が束縛しないようにする。束縛変数の名前の付け替え、つまりα変換で移りあう式は同一視されることが多い。また
を追加することもある。
束縛変数をあるやり方で一意に決めることにより、α変換(およびある意味で束縛変数そのもの)をλ計算から除去できる。これは、コンパイラが局所変数をスタック上の位置として解釈するのと同じである。
λ計算の中で自然数を表すことができる。
0 := λ f. λ x. x 1 := λ f. λ x. f x 2 := λ f. λ x. f (f x) 3 := λ f. λ x. f (f (f x))
こうすると、足し算はλ m. λ n. λ f. λ x. m f (n f x)、掛け算はλ m. λ n. λ f. m (n f)と表すことができる。
一般に、コンストラクタc1, ..., cnを持つ自由代数は、コンストラクタをci := λa1...λamλc1...λcn.ci a1 ... am (mはciの持つ引数の数)として表すことができる。
ブール値は次のように定義できる。
TRUE := λ x. λ y. x FALSE := λ x. λ y. y
論理演算は
AND := λ p. λ q. p q FALSE OR := λ p. λ q. p TRUE q NOT := λ p. p FALSE TRUE
条件分岐は
IFTHENELSE := λ p. λ x. λ y. p x y
と定義できる。また、ゼロ判定関数を
ISZERO := λ n. n (λ x. FALSE) TRUE
と定めることにより、自然数についてのゼロ条件判定ができる。
Y := λf.(λx.(f (x x)) λx.(f (x x)))をYコンビネーターと呼ぶ。Yコンビネーターは任意のλ式Mに対して、YM⇒M(YM)となる性質がある。(⇒はα、β変換の繰り返しを表す。)これを利用して再帰を定義することができる。たとえば、階乗は次のように書ける。
f = λg.λn. if n = 0 then 1 else n * g(n-1) fact = λn. Y(f) n
足し算、条件分岐、再帰ができることにより一般帰納関数(計算可能な関数)すべてをλ計算で定義できることになる。
一般に、一つのλ式にはα、β変換を適応する複数の方法がある。よって、あるλ式Mは二つの異なったλ式N1,N2に変換されうる。しかし、N1,N2に適当な順でさらにα、β変換を施すことにより、同一のλ式Lに変換することができる。これをチャーチ・ロッサー性または合流性と呼ぶ。
特に、N1がこれ以上変換できない形(正規形)であった場合を考えると、チャーチ・ロッサー性は正規形が唯一であることを意味する。これは、λ式で表されたプログラムは、演算の順序にかかわらず同一の値を返すことを示しており、λ計算の宣言的な性格が伺える。
計算規則を与えることは、計算言語としての意味を与えることと考えることができる。このような立場を計算機科学上は操作的意味論と呼ぶ。これに対して、言語の各要素に対して、それが指示する対象を与えることで意味を与える立場を(計算機科学では)表示的意味論と呼ぶ。λ計算は数学上の関数の概念から出発してはいるものの、(λx. xx)(λx. xx)のように関数に自己自身を適用できるなど通常の集合論的な関数を逸脱している。
この困難に対して、λ計算の表示的な意味論を与えたのがD.S. Scottの領域理論である。領域理論では、λ計算は完備半順序集合上の点として解釈される。λ計算内の関数は、完備半順序集合上の単調増加かつ連続*1な関数として表現される。完備半順序集合上の単調増加連続関数は、それ自体完備半順序集合をなし、さらに不動点を持つ。この性質を利用してλ計算の表示的意味論が構成される。Schemeの規格文書は領域理論による意味論を含んでいる。
また、近年ではOng, Hylandらによるゲーム意味論が注目されている。ゲーム意味論ではデータ型をゲーム、その型の値を求めるプログラムをそのゲームの戦略として解釈する。用いることのできる戦略の違いにより、並列プログラムや手続き型プログラムを特徴付けることができる。
The Lambda Calculus: Its Syntax and Semantics (Studies in Logic and the Foundations of Mathematics)
*1:ここでは極限を保存すること