为什么按价值评估策略不是图灵完整的?

时间:2010-05-31 15:06:07

标签: compiler-construction programming-languages computer-science turing-complete

我正在阅读一篇关于不同evaluation strategies的文章(我在wiki中链接了一篇文章,但我正在阅读另一篇不是英文的文章)。它表示与call-by-namecall-by-need策略不同,call-by-value策略 Turing complete

请问有人解释,为什么会这样?如果可能的话,请添加一个示例。

2 个答案:

答案 0 :(得分:10)

我在您正在阅读的文章中对此声明提出异议。 (我没有为此付出代价,所以我将提供一个暗示性的论点,而不是证据。)

众所周知,至少在正常顺序减少(也就是姓名呼叫)下,纯lambda演算是图灵完备的。但是,如果我们看看约翰雷诺兹的开创性论文Definitional Interpreters for Higher-Order Programming Languages,我们可以看到雷诺兹详细讨论了名字呼叫和价值呼叫之间的区别。论证的一个关键部分是,为了进行适当的区分,我们可以将程序转换为延续传递样式。 CPS转换对于按需调用和按值调用是不同的,但是生成的转换项可以以任一样式进行评估。

所以这里有一个论点:写一个模拟图灵机的lambda-calculus程序,然后使用CBN变换进行CPS变换,你可以使用CBV减少策略来评估结果代码。砰!图灵完全。

在实践中,我打赌你可以写一个CBV程序来模拟图灵机;它可能足以选择一个合适的定点组合器,例如Θ。 (更有名的Y组合器仅在逐个名称缩减策略下工作,即正常顺序减少。)

免责声明:我没有多年研究过lambda演算,我确信上面的论证中有几个细节错误。但我对这个实质有信心。这不是我第一次在网络资源中发现关于编程语言理论的明显错误。

答案 1 :(得分:0)

如果没有参考某些特定语言,你的问题就没那么有意义了,但我会尽力回答关于Untyped Lambda演算的问题。

对于无类型的lambda演算,存在一个按值调用的定点组合子(即“Y组合子”)似乎反驳了基本的主张(参见:Fixed Point Combinator)。这种组合子的存在打破了强烈的规范化,这表明至少有一种语言是完整的,使用了按值调用的评估策略。

更有可能影响语言的图灵完整性是类型系统的存在(或缺乏)。例如,简单类型的lambda演算不能编码固定点组合器,并且强烈标准化(即所有良好类型的项减少到一个值),然而,无论采用何种评估策略,这都是正确的。相反,它是类型系统的结果。