我将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
是root,D
是粉丝,e
是橡皮擦。)
读回这个词,我按照预期得到了1号教堂。但这个网络非常膨胀:它有很多粉丝和橡皮擦没有明显的用途。划分更大的数字甚至更糟。这是div 32 32
:
这再次回读为one
,但在这里我们可以看到冗余扇形节点的更长尾部。我的问题是:这是减少特定术语时预期的交互需求行为,还是我的实施可能出现的错误?如果这不是一个错误,那有什么办法吗?
答案 0 :(得分:6)
使用Interaction Nets从您的实施细节中抽象出来,
以及你div
的摘要算法的完整性假设,
对我来说一切似乎都很好。
尽管有chi的声明,但您无法对您显示的输出应用进一步的互动,因为D-e
对中的任何一对都无法通过其主要端口进行互动。
后一种减少规则(IN框架不允许)可以提高效率,在某些特定情况下也是如此。
基本上,所涉及的粉丝不得有任何“双胞胎”,即网中不得存在D'
,以致最终可能发生湮灭D-D'
。
有关详细信息,请查看The optimal implementation of functional programming language,章Safe nodes(可在线获取!),或查看原始论文:
Asperti,Andrea和Juliusz Chroboczek。 “安全操作员:托架永远关闭优化最佳λ微积分实现。” 适用于工程,通信和计算的代数 8.6(1997):437-468。
最后,回读程序的目的不是作为减少程序的某种外部成本,而是作为计算重复和擦除的延迟成本。 正如您所注意到的,这样的成本很少可以忽略不计,因此如果您想在真实场景中测试效率,请始终总结共享减少和回读减少。