補足 (ラムダ式)


ラムダ計算 (lambda calculus)
ラムダ計算とは、元々は Turing Machine などと同じく計算モデルの一つです。 項は、 λx.(x x) などと表されます。 ラムダ式の理論的側面に興味がある人は、聞きに来て下さい。文献でも紹介します。

lambda 式の詳細情報

カリー: curry
カリーというのは、Haskel B. Curry さんの名前から来ているそうです。 ですから、カレー化などとは言わないで下さい。 (なぜカレーはカレーと発音するのかは僕は知りません。)

動的スコープを持つ言語の場合。
実は、これに対応するプログラムを Common Lisp や Emacs Lisp といった動的スコープをもつ 言語で動かすと、"102" が返って来ます。 これは、ラムダ式が生成された環境ではなく、 ラムダ式に引数が適用された環境によって束縛関係が解決されるからです。
部分評価
例えば、先程の定義にしたがって (power-c 3)を頑張って変換してみましょう。 (power-c 3) 自体は、実は 3 乗を計算する計算に相当することに注意。
(power-c 3)
==> (lambda (n) (if (= 3 0) 1 (* n (power (- 3 1) n))))
==> (lambda (n) (* n (power 2 n)))
==> (lambda (n) (* n (if (= 2 0) 1 (* n (power (- 2 1) n)))))
==> (lambda (n) (* n (* n (power 1 n))))
==> (lambda (n) (* n (* n (* n (power 0 n)))))
==> (lambda (n) (* n (* n (* n (if (= 0 0) 1 (power (- 0 1) n))))))
==> (lambda (n) (* n (* n (* n 1))))
つまり、あるところで、 (power 3 x) という形が現われた時に、 ((power-c 3) x) に変換し、 ((lambda (n) (* n (* n (* n 1)))) x) と変換する事も可能になるわけです(あくまでも可能性の話ですが)。

ところで、このように変数部分と定数部分の混ざったものを評価して簡単化を行うことを 部分評価 (pertial evaluation) といいます。

部分評価の話題としてもうひとつ。 テーマは、インタプリタとコンパイラと部分評価。 普通インタプリタというのは、ソースをみながら対応する計算を行っていくことで、 プログラムを実行します。 しかしながらソースが変化しないなら毎度毎度ソースを眺めるのではなくて、 ソースに対応する計算を先につくっておいて、直接計算の方を実行したくなります。 つまりはコンパイルして、実行ファイルを直接実行しようというわけです。 ここで、少し見立てをしてみましょう。 「インタプリタ:interpreter」をプログラムに見立て、 「プログラム:program」と「入力:input」を入力に見立て「インタプリタ」に与えます。 で、(interpreter (program input)) を部分評価します。 そうすると、input は分からないままなので、 program に特化された interpreter が生まれます。 (interpreter (program input)) ==> (compiled-program input) というわけです。 つまり、コンパイラ操作というのは、 プログラムに特化したインタプリタをつくることだと言えます。 このようなプログラム変換の事を futamura projection と呼びます。


98.11.26/ Tomio KAMADA: kamada@seg.kobe-u.ac.jp