不動点オペレータ
どうやら、Yコンビネータという名前はあんまり一般的な名前ではなく、不動点コンビネータやら、不動点オペレータというのが一般的な名前らしい。
鉄は熱いうちに打てって言葉があるので、勢いで行く事にする。
英語だけど、Fixed point combinator - Wikipedia, the free encyclopediaの前半部分を読んで行きます。
不動点
数学でいう,不動点ってのは
f(x) = xになるような点。
つまり、gnuplotすると、
gnuplot> plot x
と交差するような点の事を不動点という。つまり、入力と出力の結果が変わらない点って事。
一般的な式にする
苦労して(遊びすぎて)手に入れた式。Yコンビネータの定義。引数をちょっと変形。
(define Y (lambda (f) ((lambda (x) (f (lambda a (apply (x x) a)))) (lambda (x) (f (lambda a (apply (x x) a)))))))
一般的な式にすると、
Y = λf.(λx.f(λa.(x x) a)) (λx.f(λa.(x x) a))
読みにくいけど、
λ 引数 . 関数本体
という形。
λ演算では、applyの所は考えないとして、
Y = λf.(λx.f(x x)) (λx.f(x x))
こうおく。
xが、ズンズン評価されてしまって、無限ループに陥るので、実行は出来ない。数学はイイナァ。
変形して遊ぶ
Y gと引数を当てる。
Y g = (λf.(λx.f(x x)) (λx.f(x x))) g
まんまっすな。
fにgを代入する。β変換。
Y g = (λx.g(x x)) (λx.g(x x)) [1]
左側のxをyに変える。α変換。
Y g = (λy.g(y y)) (λx.g(x x))
左側のyに、右側のyを代入する。β変換。
Y g = g ((λx.g(x x)) (λx.g(x x)))
となって、[1]の式を適用すると、
Y g = g (Y g)
Y g = g (Y g)が、証明出来ました。
入力と出力はおんなじものが出てくるので、Yを不動点オペレータというらしい。
まとめ
英語は殆んど読んでません。ゴメンナサイ。ゴメンナサイ。いた、いた、石なげちゃ・・・
- α変換は引数の名前を変えること。
- β変換は代入の事。
残念ながら、Y無限ループではどんどんgを生み出しちゃうので、gの中を評価し次の(Y g)を生み出すようにする。
なんだスゲー簡単じゃん!!