数百个还原步骤是否太多而无法获得Y fac⌜3⌝的正常形式?


9

由于我最近一直在教授λ微积分的基础,因此我在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算术实际上增加了步骤数……

Answers:


11

如果要使用教堂编码,那真的很糟糕pred。我建议您使用Peano样式使用一些更有效的编码:

//算术

:p_zero =λs.λz.z
:p_one =λs.λz.sp_zero
:p_succ =λn.λs.λz.sn
:p_null =λn.n(λx。ff)tt
:p_pred =λn.n(λp.p)p_zero
:p_plus =μ!f.λn.λm.n(λp。p_succ(!fpm))m
:p_subs =μ!f.λn.λm.n(λp。p_pred(!fpm))m
:p_eq =μf.λm.λn。m(λp.n(λq。!fpq)ff)(n(λx.ff)tt)
:p_mult =μf.λm.λn。m(λp。p_plus n(!fpn))p_zero
:p_exp =μf.λm.λn。m(λp。p_mult n(!fpn))p_one
:p_even =μf.λm。m(λp。非(!fp))tt

//数字

:p_0 =λs.λz.z
:p_1 =λs.λz.sp_0
:p_2 =λs.λz.sp_1
:p_3 =λs.λz.sp_2
...

这是从我的一个旧库中获取的代码,并且μ!f. …只是针对的优化构造Y (λf. …)。(而且ttffnot是布尔值。)

我不太确定您是否会获得更好的结果fac


感谢您提供的技巧,使用这种替代编码可以帮助我发现实现过程中的一些错误。实际上,它对步数没有帮助,因为在修复后,找到3的标准形式!教堂的数字用619台阶,皮亚诺的数字用687步骤…
无处人

是的,这就是我的想法,因为Y在这里使用一些特殊的约简规则对于获得简短的约简至关重要(尤其是对于Peano数)。
斯特凡希门尼斯

只是好奇,4 !, 5 !, 6!?
斯特凡·吉梅内斯

1
奇怪的是,在3!之后,Peano编码比Church编码更有效。分别获得1!,2!,3!,4!的范式 和5!使用Peano / Church,则需要10 / 10、40 / 33、157 / 134、685 / 667、3541 / 3956和21629/27311步骤。大约需要6步!通过从以前的数据进行插值,留给读者练习。

1
似乎上述恰好是斯科特数字“ Peano +λ= Scott”。其他值得尝试的是它们的二进制变体(Church和<strike> Peano </ strike> Scott都适用)。
斯特凡希门尼斯

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.