简单易懂的现代魔法
抽象函数的固定模型,固定模型的计算系统
上次我们介绍了Y组合子和Z组合子,那么可能有人想要问了,有没有其他的组合子呢?当然有,根据维基百科介绍,目前普遍接受的λ组合子有:
1 | I := λx.x |
可以看到,ω组合子正式我们在上篇推导Y组合子的中间产物。不过我们这节要介绍的组合子演算,是由S、K、I组成的演算系统。其他组合子不在初级简介的范畴内。SKI演算系统,有时候称为SK基演算,这是因为用S、K可以做到和I一样的效果,两者是外延相等(注意外延相等不等于函数自身相同,使用等价一词以区分项相同使用的相等)。用S、K表达I的方法是:
1 | ((S K K) x) |
S和K的定义都十分简单,但是证明表示,是用S、K可以组合成任何λ项!这就是说消除了λ演算里面函数定义的抽象过程,可以完全使用固定模型来表示任何函数!因为S、K组合子可以组合成任何λ项,λ演算可以计算任何可计算问题,所以,SKI演算系统是图灵完全的!拥有和λ演算等价的计算能力。
SKI演算系统(下文简称CC系统,Combinator Calculus,组合子演算)显然和λ演算息息相关,所以自然有将任意λ表达式转换成组合子表达式的方法。对于这种转换,我们定义一个变换函数T,T的定义如下(V为变量,E为项):
T[V] => V
T[ (E1 E2) ] => ( T[E1] T[E2] )
T[λx.E] => (K T[E] )
… 如果x在E中没有自由出现T[λx.x] => I
T[λx.λy.E] => T[λx.T[λy.E]]
… 如果x在E中自由出现T[λx.(E1 E2)] => (S T[λx.E1] T[λx.E2])
利用这六个变换规则,我们就可以将λ表达式转换成组合子表达式,也就是通常说的,消除函数抽象。前四个规则是相当显然的。第五个规则则是表达如果x在E中自由出现时,x无法被立即转换消除掉,所以先转换其主体,然后利用规则6最终消除抽象。在规则6里,
λx.(E1 E2)
是一个接受一个参数并应用到E1 E2上,即等于(E1 E2)[x:=v]
,据此可推导:
1 | λx.(E1 E2) v |
如果接受η-变换的话,变换函数可以根据外延性定理增加一条:
T[λx.E x] = T[E] … 如果x在E中没有自由出现
我们也很容易接受一个函数:接受x并应用x于函数E,等价于函数E本身这种关系。
这就是我要介绍的组合子演算的内容,现在用一次转换和应用来表演一下学到的新东西:
转化λx y.(y x)
到组合子表达式:
1 | T[λx y.(y x)] |
对于这个结果,我们可以验证:
1 | (S (K (S I)) K) x y |
完美!那么,这一系列就到此结束了!