图灵完成是否有最低要求?


55

为了将其视为图灵完成,是否存在以编程语言存在的一组编程语言构造?

据我从维基百科得知,该语言需要支持递归,或者看起来必须能够不间断地运行。这就是全部吗?


6
也许您的问题应该问“是否有最少的编程结构集??”,因为它的答案是“所有可计算的结构”。
戴夫·克拉克


@DaveClarke,谢谢,我已经更新了。我确实发现您的评论有点令人困惑,尽管我认为这是因为我的语言不佳。我的意思是问是否有一些操作可以使一种语言进行计算,这将是等效的。
肯佐

Answers:


45

我总是用 -recursive函数固定它。这是定义整个可计算函数集的内容。它是包含resp的最小函数集。禁止:μ

  1. 常数功能0
  2. 后继功能
  3. 选择参数
  4. 功能组成
  5. 原始递归
  6. 该 -运算符(寻找最小的这样......)Xμx

检查上面的链接了解详细信息;您会看到它构成了非常紧凑的编程语言。编程也太可怕了-没有免费的午餐。如果您放弃其中任何一个,您将失去全部力量,因此这是一组最小的公理。

您可以将这些文字转换为WHILE程序的基本语法元素,即

  1. 常数 0
  2. 增量式 _ + 1
  3. 可变访问 x
  4. 程序/语句串联 _; _
  5. 倒数循环 for ( x to 0 ) do _ end
  6. While循环 while ( x != 0 ) do _ end

1
我认为很明显,您不能删除该语言中的第五条规则。由于while6中的循环与常数零进行比较,因此变量只能通过规则2递增,并且没有从(规则1)开始的负常数,因此while6中的循环要么没有输入(x = 0)要么是无限的( x> 0,并且循环体无法减小它)。
MSalters 2015年

1
@MSalters我认为你是对的;对于我似乎已经想到的模拟,我们需要_ - 1并且如果没有,我将无法想到一种实现该模拟的方法for。感谢您抓住这一点!(“更好”是什么?包括“ _ - 1或” for?)
拉斐尔

20

是否存在需要以一种编程语言执行的一组计算才能被视为图灵完成?

是的,为了被视为图灵完整,一种编程语言需要能够执行可以由图灵机执行的任何计算。因此,至少有人可能会说,您需要能够在其中实现通用的Turing机器-或任何其他Turing完整语言的解释器。

据我从维基百科得知,该语言需要支持递归,或者看起来必须能够不间断地运行。这就是全部吗?

否。例如,仅允许递归操作的语言(即,您只能编写的唯一函数f(x) = f(x)是)不是图灵完整的,因为您可以在其中编写的程序永远不会终止。需要能够实现Turing机器可以执行的任何计算,因此显然这是不够的。

同样,语言不必以您所想的方式支持递归。只是表达循环的一种不受限制的方式。那可能是递归,但也可能是while循环或goto。完全没有功能的语言仍然可以成为图灵完整的语言。同样,循环或递归函数也不是足够的条件。您仍然需要根据条件执行不同代码的方法,以及根据旧值计算新值的方法(否则,所有循环/递归要么是无限的,要么根本不会运行)。


至于是否有最少的必要和足够的操作集,以使支持这些操作的任何语言都可以图灵完成,而任何不支持的语言则不能:不,没有(除非您如此模糊地定义“操作” ,它变得毫无意义):

例如,正如我已经说过的,有一些图灵完整的语言不支持递归函数(或根本不支持任何函数)。如果它们具有goto语句或while循环(以及存储任意数量的数据的方法),它们仍然可以是图灵完整的。但是,具有递归功能的语言既不需要while也不goto是图灵完整的。因此goto不会包含在必需的足够操作集中,但是如果您删除,那么某些语言将不再是图灵完整的goto。因此,没有这样的设置。


我不确定的唯一部分是您对最低限度的必要操作的回答。您似乎将操作的定义限制为“ 控制结构”,它的范围似乎比所要求的要狭窄得多,并且超出了您自己的定义,即“如此模糊,以至于[它们]变得毫无意义”。
Joshua Drake'4

@JoshuaDrake我不确定您的意思。我并没有将操作限制为控制结构。只是我没有在我的反例中谈论任何不是控件结构的操作,因为它们与示例无关。实际上,我确实提到了“一种存储任意数量的数据的方法”-这几乎不是控制结构。
sepp2k 2012年

您指出,某些语言支持图灵完整性,goto而有些则不支持,这似乎是因为某些语言使用它而有些则不支持,goto因此这些语言不能成为图灵​​完整性所需的一组操作的一部分。我的观点是,这goto只是实现特定的更通用操作(例如跳转)的语法方式。因此,我相信,如果您仅从特定的控制结构中抽象出来,那么您将更接近一组至少指向图灵完整性的操作。
约书亚·德雷克

@JoshuaDrake我不认为使用“跳转”代替goto可以使我们定义足够的和必要的一组操作。每种语言都可能需要某种跳转操作(如果仅是函数调用),但这确实是事实,但是我认为您将无法提出进一步的操作来使其变得足够。例如,lambda演算有两个操作:应用程序(即我们的跳转操作)和抽象化(即创建函数)...
sepp2k 2012年

1
@JoshuaDrake我不认为本文试图声称任何图灵完备的语言都需要进行这些操作。特别是因为它专门将该声明限制为过程语言。除了goto的一种形式(即函数应用程序)之外,Lambda Calculus没有任何这些东西。我认为这里的“最小”仅意味着在仅具有这些功能的语言中,您不能在不失去图灵完整性的情况下删除其中任何一个。并不是说没有其他最小的操作集足以满足图灵完整性。
sepp2k 2012年

14

有各种单一的指令可以生成图灵完整的语言。典型示例是“如果为零则减去并分支”。这些在汇编语言编程的上下文中是众所周知的。有关详细信息,请参见Wikipedia文章

这导致了一个特征:一种语言只有在能够模拟在内存中提取和存储整数并对它们执行“减零并分支为零”的操作的情况下,图灵才是完整的。


13

这不是您问题的一般答案,但是根据结构化编程定理,所需要做的只是进行选择(例如,if在C / C ++中)和重复(例如,while在C / C ++中)的能力。编辑:正如Dave Clarke在评论中指出的那样,结构化编程定理也需要序列。我最初并没有列出它,因为我认为是理所当然的,读者会理解其他指令的基本块,例如后来提到的用于读取和写入内存等的基本块也是必要的。当然,最好明确一些;您还需要能够执行这些操作。

由于这两个都可以使用条件跳转指令(例如,JNZ在x86中)实现,因此对于图灵等效性也足够了。

请注意,还需要其他条件,即能够将无数符号(例如,位... 0或1)写入某种外部存储器中。从这种意义上讲,实际的计算机与图灵不一样,因为它们都没有无限的存储量。不过,由于内存量通常很大,因此Turing模型仍然有用,并且即使确定的有限自动机可以解决实际计算机可以解决的任何问题,但使用该计算模型并不是特别有用(因为州的数量将会非常庞大​​)。

注意,这不一定与sepp2k的答案不一致。这只是思考同一问题的另一种方式。

编辑:

还请注意ifwhile在C / C ++中,您并不需要两者。您可以if使用while以下方法进行模拟:

bool C;
// some code that sets C
if(C) { /* some other code /* }
// rest of the program

以下代码始终等效:

bool C;
// some code that sets C
bool C2 = C;
while(C2) { /* some other code /* C2 = false; }
// rest of the program

好吧……如果您小心的话,该构造应该可以正常工作并且是可能的。还请注意,如果您具有递归函数,那么最终还需要选择;由于没有选择的递归函数不能真正实现基本情况,因此任何递归函数都将导致无限递归。

编辑:

另外,关于您的问题,即编写不停止程序的能力是否足以满足图灵等价问题,答案是否定的。这是必要的,但还不够。对于用无法表达无法停止的程序的语言编写的程序,我们可以解决停止的问题。答案是“程序确实停止了”。但是,我们可以定义一种语言,其中唯一的指令会导致机器进入无限循环……这种语言不是与图灵等效的。


13

组合器和其中,和足以表示任何(封闭的)λ项,因此可以表示任何可计算的函数。有关详细信息,请参见此Wikipedia页面KS x y z = x z y z K x y = xSK(S x y z)=(x z (y z))(K x y)=x

实际上,lambda项是表达所有lambda项的充分基础。稍后在同一Wikipedia页面中查看X=λx.((x S) K)


5

语言结构可以互换

对于编程语言必须本地提供哪些构造,没有设置最低标准。如果它提供了一些奇怪的构造,可以以某种方式将它们卷积起来以表示图灵完备的系统,那么显然那些构造与其他任何构造“一样合适”。

为了证明这一点-一种提供“如果零则减并分支” 的语言的图灵完成;存在图灵完整的语言,它们没有提供单独的“减零则为分支和分支”构造,因此没有构造或强制构造的集合。

任何TP完整语言构造的影响都可以由任何其他TP完整语言构造来模拟。

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.