我正在将 lambda 演算项编译到交互网络中,以便使用 Lamping 的抽象算法对其进行评估。为了测试我的实现,我使用了这个教堂编号除法函数:
div = (λ a b c d . (b (λ e . (e d)) (a (b (λ e f g . (e (λ h . (f h g)))) (λ e . e) (λ e f . (f (c e)))) (b (λ e f . e) (λ e . e) (λ e . e)))))
4 除以 4(即(λ k . (div k k)) (λ f x . (f (f (f (f x)))))
),我得到这个网:
(抱歉渲染效果很糟糕。λ
是一个 lambda,R
是根,D
是一个粉丝,e
是橡皮擦。)
回读这个术语,我得到了教堂编号 1,正如预期的那样。但这张网非常膨胀:它有很多粉丝和橡皮擦,但没有明显的用途。除更大的数字更糟糕。这是div 32 32
:
这再次读回为one
,但在这里我们可以看到冗余风扇节点的尾巴更长。我的问题是:这是减少该特定术语时交互需求的预期行为,还是我的实现中可能存在的错误?如果这不是一个错误,有什么办法可以解决吗?
是的,这是常见的(但有一些技术可以减少它的存在)
从交互网络实现的一些细节中抽象出来,
以及您对抽象算法的合理性的假设div
,
对我来说一切都很好。
尽管有,但无法对您显示的输出应用进一步的交互chi https://stackoverflow.com/users/3234959/chi的声明,因为没有一对D-e
可以通过其主端口进行交互。
-
后一种归约规则(IN框架不允许)可以提高效率,并且在某些特定情况下也是合理的。
基本上,所涉及的粉丝不得有任何“双胞胎”,即不得存在任何“双胞胎”D'
在网中最终毁灭D-D'
可以发生。
欲了解更多详情,请查看函数式编程语言的优化实现 http://www.worldcat.org/title/optimal-implementation-of-functional-programming-languages/oclc/38067735, 章节安全节点 http://lex104.cs.unibo.it/pub/asperti/safe.ps(可在线获取!),或查看原始论文:
阿斯佩尔蒂、安德里亚和朱利叶斯·克罗博切克。 “安全算子:括号永远关闭,优化最优 λ 微积分实现。”工程、通信和计算中的应用代数8.6(1997):437-468。
最后,回读过程必须不是作为缩减过程的某种外部成本,而是作为计算复制和擦除的递延成本。
正如您所注意到的,这样的成本很少可以忽略不计,因此如果您想在现实场景中测试效率,请始终总结共享减少和回读减少。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)