由于我最近一直在教授λ微积分的基础,因此我在Common Lisp中实现了一个简单的λ微积分评估器。当我问正常Y fac 3
阶约简的正常形式时,它需要619个步骤,这似乎有点多。
当然,每次我在纸上进行类似的简化时,我都从未使用过无类型的λ微积分,而是增加了对其进行运算的数量和函数。在这种情况下,fac的定义如下:
fac = λfac.λn.if (= n 0) 1 (* n (fac (- n 1)))
在这种情况下,考虑到=
,*
并-
为讨好的功能,只需要大约50个步骤,以获得Y fac 3
其正常形态6
。
但是在评估人员中,我使用了以下方法:
true = λx.λy.x
false = λx.λy.y
⌜0⌝ = λf.λx.x
succ = λn.λf.λx.f n f x
⌜n+1⌝ = succ ⌜n⌝
zero? = λn.n (λx.false) true
mult = λm.λn.λf.m (n f)
pred = λn.λf.λx.n (λg.λh.h (g f)) (λu.x) (λu.u)
fac = λfac.λn.(zero? n) ⌜1⌝ (* n (fac (pred n)))
Y = λf.(λf.λx.f (x x)) f ((λf.λx.f (x x)) f)
在619步中,我得到Y fac ⌜3⌝
的正常形式⌜6⌝
,即λf.λx.f (f (f (f (f (f x)))))
。
从许多步骤的快速浏览中,我猜想这pred
是需要这么长时间减少的定义,但是我仍然想知道这是否可能对我的实现造成很大的麻烦...
编辑:我最初询问了大约一千个步骤,其中一些确实导致了正常订单的错误执行,所以我下降到初始步骤数的2/3。如下所述,在我当前的实现中,从丘奇算法转换为Peano算术实际上增加了步骤数……