如何在基于 lambda 演算的系统中将 beta 归约还原为命名函数?

How to revert beta-reductions to named functions in a lambda calculus-based system?

好吧,假设我在教堂编码中有一组功能定义(带有语法树):

true : λx -> λy -> x
false : λx -> λy -> y

给出定义 λx -> λy -> y,很清楚如何 return 命名定义,应用与 alpha-equivalence 的匹配就足够了。

α true λx -> λy -> y = false
α false λx -> λy -> y = true

但请考虑以下示例:

0 : λf λz -> x
succ : λn λf λx -> f (n f x)
3 : succ (succ (succ 0)))

因此,当 3 遭受 beta 减少时,它将展开为某些定义,例如:

3_unfolded : (λf -> (λx -> (f (f (f x))))) : (A -> A) -> A -> A

你可以看到项很容易变大,当然,这不是表示纯数据的好方法,因为项的大小。所以,我想知道是否有一种算法能够在经过评估后有效地重新命名每个定义。他们3_unfolded将再次成为(succ (succ (succ 0)))通过给出自然教会编码的定义集(0,和仅succ)。

我知道有一些副作用,比如不明确的表示,但让我们忽略它(例如,如果您扩展 succ 的相同定义并重命名为 succ_2)。

这本质上是beta等价问题,一般情况下是不可判定的;它也不一定会产生 usable 输出,即使它可以产生 something,例如有一些限制,包括强规范化。因此,我认为您最好的策略是启发式的,因为 默认情况下,减少会破坏信息 。解决方案是保留您关心的信息,或者避免需要已经消失的信息。例如:

  1. 将术语的内存表示与其 LC 表示分离,特别是在您关心效率和可用性的情况下。例如,您可以将教会数字存储和打印为 Natural,同时仍允许根据需要将其转换为函数。我认为这是最实用的技术角度。

  2. 保留有关每个术语出处的信息,并将其用作提示 以重建命名术语。例如,如果您知道某个项是由给定的 beta 缩减形状产生的,则可以 beta-expand/alpha-match 到 可能 重新发现 succ 等函数的应用.这在简单的情况下可能会有所帮助,但我预计它会在重要的程序中失败。

  3. 与其将其视为算法问题,不如将其视为可用性设计问题,并专注于识别有用信息并清晰呈现的方法。例如,搜索 最大 匹配的函数体也是 最具体 ,例如一个术语可能同时匹配λx. x(身份)和λf. λx. f x(功能应用),但后者更具体,更具体地说它可以是数字(λs. λz. s z = 1);如果有多种可能性,请给出最有可能的几种。

每当遇到对任意程序都无法确定的问题时,值得记住的是,人类会编写 极其非任意的 程序。因此启发式解决方案在实践中非常有效。