コンビネータメモ

メモメモ。

Z

Yをη変換するとZ

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

η変換ってなんだかよくわからんけど、λを一個追加(削除?)することらしい。

とりあえずη変換してみよう。

(lambda (x) x)
; ↓ η変換
(lambda (y) ((lambda (x) x) y))

一回lambdaで囲んでも意味は変わらない。

η変換すると、理論上での計算の意味合いは全く一緒だけど、計算機上では評価順序が変わるのがポイントらしい。


不動点オペレータ - ボクノスコレネ。

これが純粋なYコンビネータ

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

外側は意味が無いので、一番内側の(x x)をaでη変換すると、(λa.(x x) a)。

代入する。

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

おぉ。η変換だったのか。

純粋なYだと、最後の(x x)が評価されて、Yの方だけガンガン進んでしまう。そこで、η変換して計算の順序を遅らせる。Haskellで言うと、(1 +)的な状況を作る。すると、計算できないから、λごと渡す。後で(x x)の中を見る。遅延する。

これが、遅延評価の仕組み。演算全てをη変換すれば、遅延評価系になる。Haskell完成。

ほうほう。理解が深まった気がする。「sk修行は効果てきめんだ」

追記

あら?Wikipediaによるとη変換の操作は逆らしい。

λV. E V  → η → E

計算論を立ち読みしたら、逆も出来るらしい。立ち読みなので、はっきりしないけど(汗


オメガ

Ω = (λx.x x) (λx.x x)

これは勇気が無くて、試せないな(笑)

YK

アレ?

Y K a = K (Y K) a = Y K

アレ?

((((Y K) 'a) 'a) 'a)

ホントダ。楽しい。

V

V発見。Vはvoid自分自身を返す。schemeで書くと、

(define (V x) V)

そんなことが出来るのか!!凄い!!

```s``s`kskk``s``s`kskk

あとで読む。



意味不明な事を語ってるな(汗

コンビネータおもろい。計算論とか買った方が良さげな感じがしてきた。