互动网留下一堆堆多余的粉丝是不是很正常?

Is it usual for interaction nets to leave piles of redundant fans?

我正在将 lambda 演算项编译为交互网络,以便使用 Lamping 的抽象算法对其进行评估。为了测试我的实现,我使用了这个 church-number 除法函数:

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 声称,但无法对您显示的输出应用进一步的交互,因为 none 对 D-e 可以交互通过他们的主要港口。

  • 后一种归约规则(IN框架不允许的)可能会提高效率,在某些特定情况下也是合理的。 基本上,涉及的粉丝必须没有任何"twin",即网络中必须没有D',这样最终会发生湮灭D-D'。 有关详细信息,请查看 The optimal implementation of functional programming language, chapter Safe nodes(可在线获取!),或查看其来源的原始论文:

    Asperti, Andrea, and Juliusz Chroboczek. "Safe Operators: Brackets Closed Forever Optimizing Optimal λ-Calculus Implementations." Applicable Algebra in Engineering, Communication and Computing 8.6 (1997): 437-468.

  • 最后,回读过程不能作为减少过程的某种外部成本,而是计算复制和擦除的递延成本。 正如您所注意到的,这样的成本很少可以忽略不计,因此如果您想在真实场景中测试效率,请始终总结共享减少和回读减少。