对于lambda表达式(x (λx y. x y) z h)
,我不明白如何在C代码中转换自由变量x (outer x)
,z
和h
?
此致 darkie
答案 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的自由变量假设。)