【发布时间】:2021-09-21 19:18:06
【问题描述】:
好吧,假设我在教堂编码中有一组功能定义(带有语法树):
true : λx -> λy -> x
false : λx -> λy -> y
给定定义 λx -> λy -> y,很清楚如何返回命名定义,应用与 alpha 等价的匹配就足够了。
α 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(succ 0)))),通过给出自然教会编码的定义集(0,并且只有succ)。
我知道有一些副作用,比如模棱两可的表示,但让我们忽略它(例如,如果您扩展 succ 的相同定义并重命名为 succ_2)。
【问题讨论】:
-
“给出定义 λx -> λy -> x,很清楚如何返回命名的定义”您能否展示一下(包括在您的问题中),以便清楚您的意思通过那个。你的意思是,检测它实际上是
true?如果是这样,问题就变成了,你用什么 Haskell 术语来代表你的“λx -> λy -> x”实体? -
我无法理解目标。您不能检查标准形式是否包含教堂数字并将其替换为所需的等价物吗?相反,目标是否更普遍?如果是这样,你应该从精确的形式化开始。
-
Beta 等价性无法确定。
-
...我也不认为
3在 lambda 演算的通常语义下计算为3_unfolded。为此,您必须在活页夹下进行评估,而这...通常不会完成。从根本上来说这并没有什么坏处,它只是让程序员更难编写一个可靠地终止的程序。 -
这就像试图通过它的输出来恢复一个程序。当然,您总是可以将输出推入“打印”语句并宣布胜利,但当然有无数程序产生相同的输出。你想要最短的吗? (不可能)最人性化的一个? (您如何定义?)
标签: function haskell functional-programming lambda-calculus church-encoding