At Mon, 13 May 2002 20:02:19 +0900,
> >詳細は間違っているかもしれませんが,こ
> >れらを使ってYコンビネータを作ると次の通りです.
> >
> >   U = S I I = λ f . (f f)
> 
> これはちょっとおかしくないですか?少なくとも (U I) = I I = I 

はい,間違っています.U = λ f x . f (x x) です.

> これには2つ疑問がありまして、一つは、先の U を忠実に書けば U
> は遅延なしに U = proc{|f| f[f]} となるのではないかと。実際、

はい,これで十分です.僕が x を余分に入れてしまったので.

> もう一つは、_fact の中で f[f] が使われているという所です。
> Y の良くできたところは proc の本体の中身の f を f[f] に
> 自動的に変換してくれるところです。

はい,そうだと思います.以下のような例はどうでしょう?

U = proc{|f| f[f]}

def u_rec
  U[proc{|f| proc{|x| yield(f[f])[x] }}]
end


Y = proc{|g|
  proc{|f|
    g[f[f]]
  }[
    proc{|f|
      g[proc{|y| f[f][y]}]
    }
  ]
}

# g[] の代わりに yield() を使う
def y_rec
  proc{|f|
    yield(f[f])
  }[
    proc{|f|
      yield(proc{|y| f[f][y]})
    }
  ]
end

u_fact = u_rec{|f| proc{|x|
  if( x > 0 )
    x * f[x-1]
  else
    1
  end
}}

y_fact = y_rec{|f| proc{|x|
  if( x > 0 )
    x * f[x-1]
  else
    1
  end
}}

p u_fact[3]
p y_fact[3]

# 再帰Procを作るメソッドをライブラリで提供してもよさそうな…
-- 
Takaaki Tateishi <ttate / kt.jaist.ac.jp>