Lambda演算表达式

时间:2010-06-22 01:10:34

标签: lambda-calculus

对于lambda表达式(x (λx y. x y) z h),我不明白如何在C代码中转换自由变量x (outer x)zh

此致 darkie

2 个答案:

答案 0 :(得分:4)

将lambda演算转换为C代码并非易事。通常你会写一个解释器,逐步评估。也就是说,将表达式转换为树,并找到最靠近根的节点,该节点是左侧是lambda的应用程序。现在在右手边替换。重复,直到你不能再申请,并得到结果。

请注意,此处没有直接等效的自由变量;我们只是用它们来知道在哪里替换东西。

请记住,图灵等效不需要两种图灵完备语言中任何概念之间的精确等价。它只需要你能够模仿另一个,反之亦然。

答案 1 :(得分:1)

自由变量是Lambda微积分中的一个特例 - 它们不能“转换”为任何东西,所以通常它们只被视为符号。在你的例子中,并给出一些用于lambda表达式的虚构构造函数,你将它转换为以下(包括处理隐式currying)类似C的表达式:

mk_app(mk_app(mk_app(mk_sym("x"),
                     mk_lam("x",
                            mk_lam("y",
                                   mk_app(mk_var("x"),
                                          mk_var("y"))))),
              mk_sym("z")),
       mk_sym("h"));

显然,您也可以将mk_var()用于这些符号,但这会产生误导,因为它们不是真正的变量,因为它们不受约束。换句话说,如果你对表达式进行任何alpha转换,它们必须保持不变。

(顺便说一下,这里的相关部分是Barendregt的自由变量假设。)