generated at
Zコンビネータ
Y = (λf. (λx. f (x x)) (λx. f (x x)))
Yコンビネータ遅延評価を前提としていて、これを正格評価で扱うと発散してしまう

代わりにZコンビネータを使うと、正格評価においても不動点コンビネータとして機能する
Z = λf. (λx. f (λy. x x y)) (λx. f (λy. x x y))


TaPLは、実際のfactorialの例での簡約の計算が分かりにくい。 p51のところ
h h とかfctとかが遠回りだ
あー、もしかしてちゃんと正格評価するとこうなのか?
そういうことだった


ググると、以下の記事が上位にヒットするが、簡約の計算の最後でどちらも同じ間違いをしている
正しくは Aa = M(\y.Ay)a であり、最後の変形はできない
M(\y.Ay)aは、(M(\y.Ay))aであって、右側の二項を結合できない

正しくは (g (\y. (z g) y)) n であり、最後の変形はできない
左結合のところを間違って右結合してる
x y z は(x y) zであり、関数適用に結合法則は無いので、(x y) z ≠ x (y z)

簡約という変形は、数学的な式変形とは違うということも注意しないといけない




簡約ではなく、式変形のような形で説明すると
f
Z := λf. (λx. f (λy. x x y)) (λx. f (λy. x x y)) このとき Z f = (λx. f (λy. x x y)) (λx. f (λy. x x y) //① = f (λy. (λx. f (λy. x x y) (λx. f (λy. x x y) y) ================== ================== ここが①と同じ = f (λy. Z f y) = f (λy. Z f y) なにか引数を渡したとしても Z g n = g (λy. Z g y) n
変形できるのはここまでである
(λy. Z g y) が、 Z g の遅延評価に相当する

下線部をZ fにするところが、簡約でない箇所であり、厳密性には欠ける