好吧,假设我在教堂编码中有一组功能定义(带有语法树):
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 0))),通过给出自然教堂编码的定义集(0,并且只有 succ)。
我知道有一些副作用,比如模棱两可的表示,但让我们忽略它(例如,如果你扩展 succ 的相同定义并重命名为 succ_2)。