可实现性理论:Lambda微积分和图灵机之间的功率差异


48

我有三个相关的子问题,下面由要点突出显示(不,如果您想知道的话,不能将它们拆分)。安德烈·鲍尔(Andrej Bauer)在这里写道,某些功能可以通过图灵机实现,而不是通过lambda微积分实现。他推理的关键步骤是:

但是,如果使用lambda演算,则[c]程序应该从表示函数f的lambda项中计算出一个表示Turing机的数字。这是不可能做到的(如果您将其作为一个单独的问题来问,我可以解释为什么)。

  • 我想查看解释/非正式证明。

我在这里看不到如何应用莱斯定理。因为将谓词应用于等效项会产生相同的结果,因此它适用于“此吐鲁吐机T和该λ项L是否相等?”的问题。但是,所需的函数可能针对不同但等效的λ项计算不同但等效的TM。

  • 而且,如果问题在于反省lambda项,我认为传递lambda项的Gödel编码也是可以接受的,不是吗?

一方面,鉴于他的示例涉及到在lambda演算中计算图灵机完成给定任务所需的步骤数,所以我并不感到惊讶。

  • 但是,由于lambda演算无法解决与Turing机相关的问题,因此我想知道是否可以为lambda演算定义一个类似的问题,并证明它不适用于Turing机,或者实际上在支持上存在差异图灵机(这会让我感到惊讶)。

Answers:


56

John Longley在一篇非常广泛的调查文章中讨论了所涉及的问题“高级类型的可计算性概念”

基本思想是,Church-Turing论文仅涉及从函数-而且计算还不止于此!特别是,在编写程序时,我们会使用更高类型的函数(例如)。NNNNN(NN)N

为了完全定义高级计算模型,我们需要为函数指定调用约定,以便允许一个函数调用作为参数接收的另一个函数。在lambda演算中,标准的调用约定是我们用lambda项表示函数,而在lambda演算中对lambda唯一可以做的就是应用它。在图灵机的典型编码中,我们通过固定特定的Godel编码将函数作为参数传递,然后将字符串表示要作为参数传递的机器索引。

编码上的差异意味着您可以使用TM样式的编码来分析参数的语法,而不能使用标准的lambda-calculus表示法来分析。因此,如果您收到类型的函数的lambda项,则只能通过传递特定的来测试其行为-您无法分析任期。这还不足以找出lambda项的代码。 nNNn

值得注意的是,对于更高类型的语言,如果一种语言的一阶表达能力较差,那么一阶语言的表达能力就更高,因为函数是互变的。因此,类似地,您可以在LC中编写某些函数,而您不能使用TM样式的编码(因为它们依赖于您可以传递函数参数并且知道接收者无法查看您提供的函数内部的事实) 。

编辑:这是在PCF中定义的函数的示例,但在TM + Goedel编码中没有。我将声明该isAlwaysTrue功能

 isAlwaysTrue : ((unit → bool) → bool) → bool

如果其参数忽略其参数并始终返回true,则应返回true;如果其参数在任何输入上返回false,则应返回false;如果其参数在任何输入上进入循环,则应进入循环。我们可以很容易地定义此函数,如下所示:

isAlwaysTrue p = p (λ(). true) ∧ p (λ(). false) ∧ p (λ(). ⊥)

where 是循环计算,并且是布尔值上的and运算符。之所以unit → bool可行,是因为PCF 中只有三个居民,因此我们可以对其进行详尽列举。但是,在TM + Goedel编码样式模型中,p可以测试其参数返回答案所需的时间,并根据该参数返回不同的答案。因此,isAlwaysTrue使用TM 的实现将无法满足规范。


1
这是一个很好的调查。谢谢你的链接!
Suresh Venkat 2010年

我只是意识到我忘了接受答案,尽管我本意接受您的回答。抱歉!
Blaisorblade

“编码上的差异意味着您可以使用TM样式的编码来分析参数的语法,而不能使用标准的lambda-calculus表示法来进行分析。”:但是,如果您有函数组合的表示法?另外,您所说的似乎表明,HOL不仅仅是类型化λ演算的理论,还不止于此?
Hibou57 '16

另外,如何处理:cs.virginia.edu/~evans/cs150/classes/class39/lecture39.pdf。这在某种程度上是错误的吗?
Hibou57 '16

尊敬的Neel,您是否有一个可以在lambda演算模型中实现但在Turing模型中无法实现的函数的示例?
Ingo Blechschmidt

29

尼尔所说的,还有以下内容。

我想强调的(再次再次)的输入和输出事项表示。如果允许我们更改表示形式,我们几乎可以实现任何事情(例如,使任何给定的函数都可计算)。因此,从功能的表示经过由组术语由哥德尔数的表示是接受的,如果我们的计算模型是演算(因为这时钻营操作 -calculus 变得不可计算)。 λ λ λNNλλλ

在 -term模型中可实现但在Turing机器模型中不可实现的语句是“并非每个函数都有Gödel代码”,这有点愚蠢。我将尝试提出一个更好的方法并编辑此答案。ÑÑλNN


在2013-10-07上编辑:这就是我的意思,“咖喱变得无话可说”。假设我们使用无类型的演算作为我们的计算模型,但随后我们决定我们应该使用Gödel代码(图灵机的编码为教堂数字)表示映射。听起来无害,对吧?毕竟,我们相信“车床和微积分是等效的” 的口头禅。ÑÑ λλNNλ

好吧,对于这个新表示形式实际上是的有效表示形式,我们还需要实现应用程序和currying(因为“表示函数”的含义与“表示一个函数”指数对象”)。具体来说,我们需要一个 -term,使得每当教会标号表示然后由下式表示。(在这里,我为代表数字的教堂数字写。)这样的 λ 一个p p ‾ Ñ ˚F ÑÑ ˚F ķ 一个p pNNλappn¯f:NNf(k)¯ Ñ Ñ一个ppλappn¯k¯n¯napp之所以容易获得,是因为它相当于在 -calculus中实现的图灵机的解释器。λ

但是,该怎么办呢?为此,我们需要以下内容。假设是一个表示的集合。给定由项计算的任何映射,我们需要证明换位也由某些 term计算。但是,考虑以下示例,其中是由 -terms表示的fmap的集合,而是application。那么将是一个映射,充当标识˚F X × ÑÑ λ ˚FX ÑÑλ 小号X ÑÑ λ ˚F ˚F ÑÑ λ λ ÑÑ λXf:X×NNλtf~:X(NN)λsXNNλff~NN的,但它的实现器是一个其将-term组术语表示地图对应哥德尔代码。这样的 -term不存在(例如,因为它在拓扑语义模型中是不连续的)。λλNNλ

您可能会试图反对我不应该使用 -terms 表示的映射的特定表示集,因为我们“同意”应该由Gödel代码表示。但是你会错的。首先,我可以使用带有更复杂证明的另一个来避开您,但仍然可以达到相同的结果。其次,在类别中,指数的定义要求所有对象的日常工作。您必须尊重类别。您不能只是随机屠宰并取出一些物体(嗯,可以,但是您却是屠夫)。ÑÑ λ X XXNNλXX


2
仍在等待那个更好的例子……
雅克·卡莱特

1
好吧,我可以想到许多图灵机可以实现的语句,但 -terms 无法实现。我想你要相反。嗯 λ
Andrej Bauer

我不知道怎么会变得难以理解。您应该能够重用smn定理,因为它的证明在一阶数据(自然数)上构造了一个函数。根据Church-Turing的论点,这种自然行为可以作为lambda术语(内部使用本机函数,但我不知道如何禁止)实现。可以类似地证明utm定理,所以根据您的帖子,我们应该做。我想念什么?
Blaisorblade

1
我在回答中解释了“变得难以计算”的含义,即建议的对象在表示的集合类别中不是指数的。
Andrej Bauer

感谢您的解释!不幸的是我不能再次投票。我可以遵循大多数技术细节;我不熟悉拓扑模型,但是无论如何,我还是熟悉“您不能检查函数式编程/λ演算中的函数”。您的最后一段还解释了为什么我无法通过smn,因为smn给出的循环再次产生Gödel代码,而不是您所需要的标准函数。我将在该段中进行冥想。
Blaisorblade
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.