不動点コンビネータ - Wikipedia

不動点コンビネータ (fixed point combinator) は与えられた関数の不動点を求める高階関数

不動点

写像の不動点とは、その写像によって自分自身に写される点のこと。

が写像 の不動点であるとは、 が成り立つこと。

高階関数 が不動点コンビネータであるとは、任意の関数 に対し、 とすると が成立する、つまり、

が成立することである。

無名再帰

無名再帰とは、名前に束縛されない無名関数において再帰を行うこと。 自分自身が名前を持たないため、工夫が必要になる。

ラムダ計算においては、引数には名前があることを利用して、不動点コンビネータを利用して再帰を行う。

不動点コンビネータによる無名再帰

再帰的な関数 があるとき、 の定義式は高階関数 を用いて

と書ける。 の定義に 自身が登場するということである。

をカリー化して高階関数

のように定義する。

を不動点コンビネータとするとき、 の不動点 は関数であり、 は再帰関数 と一致する (証明は後述)。 このことを利用して無名再帰ができる。

と同じ働きをする無名関数を得たい。 まず を定義する。 次に をカリー化して を得る。 は再帰が可能な無名関数であり、これは と同じである。

の証明

不動点コンビネータの定義より

となる。 値 に対して

つまり

これは

で置き換えたものである。 これは の再帰的な定義式だったので、 の定義式を満たすことがわかる。 そのため

が成立する。

不動点コンビネータの例

ここでの型無しラムダ計算の EBNF は以下の通り。 自明な場合でもカッコの省略はしない。 カッコはすべて関数適用であり、式自体をカッコで囲むことはしない。

expr = "(", expr, expr, ")"  ? 関数適用 ?
     | "λ", IDENTIFIER, ".", expr  ? ラムダ関数 ?
     | IDENTIFIER

Y コンビネータ

型無しラムダ計算における不動点コンビネータの 1 つ。 ハスケル・カリーによって発見された。

Y = λf.(λx.(f (x x)) λx.(f (x x)))

実際の適用過程

(Y e) = (λf. (λx.(f (x            x           )) λx.(f (x x))) e)  -- Y の定義より
      =      (λx.(e (x            x           )) λx.(e (x x)))     -- β 簡約
      =      (λy.(e (y            y           )) λx.(e (x x)))     -- α 変換
      =          (e (λx.(e (x x)) λx.(e (x x))))                   -- β 簡約
      =          (e (Y e))                                         -- 2 行目より

Z コンビネータ

値渡し評価でも使用可能なバージョンの Y コンビネータである。 Y コンビネータの一部を η 変換することで得られるらしい。

Z = λf.(λx.(f λy.((x x) y)) λx.(f λy.((x x) y)))

"上"のページ: 計算理論