星期三, 四月 09, 2008

[computer science]Church Numerals

说来惭愧,lambda,我虽然也算半个科班,却还不太清楚。看了看g9老大的文章,有了点兴趣。
不过说句实话,g9老大虽然是中文,却还不如这篇文章好懂。
闲话少说,起因是上面Rice大学311课程的辅助材料里面提到了Church Numerals的exponentiate的形式应该是怎么样的。
Church Numerals
Zero:C0 = lambda fx.x
one: C1 = lambda fx.fx
n: Cn = lambda fx. f(f(...(fx))) = lambda fx.f^n x

if M =Cm, N = Cn, then

ADD:
Cm + Cn = lambda MN. lambda fx. N f(M f x)

Multiplication:
Cm*Cn = lambda MN.lambda fx. N(M f) x

具体我就不验证了,文章中清清白白,只要按照lambda算子的规则就能得到想要的结果。问题是指数运算呢?

我大概推了一下,也不知道对不对,还希望哪位看到错了能指出来, 3ks先

exponentiate:
Cn*Cn = lambda f x. Cn(Cn f) x
Cn·Cn·Cn = Cn·lambda f x. Cn(Cn f) x
= lambda fx. (lambda f1 x1.Cn (Cn f1) x1)(Cn f) x
=
lambda f x. Cn (Cn (Cn f)x

Cm^Cn = lambda fx. M(M (...(M f)))x = lambda fx.(M^N f)x
还是很好玩的。^~^

数学是很抽象的,就像曲率。要想知道具体含义,还得有个文字解释,做一条切线。

lambda算子目前我还不是很明白,不过自己稍微想了一下,还是很有意思的。lambda就相当于函数名称,f,x相当于参数,譬如lambda fx.sth我们可以表示为:
func(f, x) = sth
func(f, x)
{
sth;
}
只不过lamdba把他们都写在了等号的一边,aha,函数参数加上一个引用,OK, like this
func(f, x, &sth)
{

}

关键是我们不需要知道函数体是怎么样的。我们就知道我们可以构造出来Church数,构造出来表达式,按照我们熟悉的运算法则运算。太神奇了,Church果然是天才啊。

还没有可以学习lambda在实际语言中的应用,譬如python(我就不说lisp了),有了感想在写。

BTW:
1.这篇文章更加通俗易懂,还有很多online pratices
2。Rice univ.的这门课程311似乎也很是值得看看,应该就是这门课程开发了DrScheme环境,对向我这样的new comer很友好,只不过现在好像换成Java了