什么是图灵完整?


Answers:


323

这是最简单的解释:

Turing Complete系统是指可以在其中编写将找到答案的程序的系统(尽管无法保证运行时或内存)。

因此,如果有人说“我的新事物是图灵完成”,这意味着原则上(尽管通常不是在实践中)可以用来解决任何计算问题。

有时候这是个玩笑...一个人在vi中编写了Turing Machine模拟器,因此可以说vi是世界上唯一需要的计算引擎。


18
有关更多阅读,请参见带注释的图灵。很平易近人。amazon.com/Annotated-Turing-Through-Historic-Computability/dp/…–
i_am_jorf

43
“经常不在实践中”是不正确的。实际上,没有任何系统是图灵完备的,因为没有可实现的系统具有无限的磁带。我们真正的意思是,某些系统能够将图灵完备性近似到其可用内存的极限。
谢尔比·摩尔

22
但是Vi是世界上唯一需要的计算引擎... ;-)
Joe Edgar

4
Emacs也是一台车床吗?XD
alem0lars

6
最近有人表明PowerPoint也是图灵完成的。
Tagc

192

这是最简单的解释

艾伦·图灵(Alan Turing)创建了一台可以接受程序,运行该程序并显示一些结果的机器。但是后来他不得不为不同的程序创建不同的机器。因此,他创建了可以使用任何程序并运行它的“通用图灵机”。

编程语言类似于那些机器(尽管是虚拟的)。他们接受程序并运行它们。现在,一种编程语言称为“图灵完成”,前提是该程序语言可以在给定的时间和内存的情况下运行图灵机可以运行的任何程序(与语言无关)。

例如:假设有一个程序将10个数字相加。图灵机可以轻松运行此程序。但是现在想象一下,由于某种原因,您的编程语言无法执行相同的加法运算。这将使其变成“ Turing incomplete”(可以说)。另一方面,如果它可以运行通用图灵机可以运行的任何程序,那么图灵就完成了。

大多数现代编程语言(例如Java,JavaScript,Perl等)都具有图灵完整的功能,因为它们各自实现了运行程序所需的所有功能,例如加法,乘法,if-else条件,返回语句,存储/检索/擦除方式数据等等。

更新:您可以在我的博客文章中了解更多信息:“ JavaScript正在完成图灵化” —解释


5
当我记得Turing和其他早期的计算机科学家每次想解决特定的问题时都会建造一台特定的机器时,甚至会用这种机器的术语这个想法就变得更加有意义。我们习惯于一台可以永远重新编程的机器。谢谢您提供的上下文,Raja。
雅各布·福特

JavaScript如何实现图灵完成?它缺少文件系统,没有适当的多线程API。它有很多限制,主要是由于其浏览器安全沙箱特性。它几乎不能被称为“一种编程语言”。看看存在多少种脚本抽象(反应,打字稿..您为它命名),所有这些都可以弥补JS所没有的。(此处应提及asm.js)。Java,Python或C ++是真正的“ Turing Complete”示例。但是js?我不这么认为。
Michael IV

2
@MichaelIV游览机也没有文件系统/线程。JS绝对是完整的巡回演出。
Bax

@MichaelIV为了增加Bax的响应,可以考虑一台现代计算机,该计算机由几台 Turing机器组成,这些机器可以一起工作,以允许您提及所有这些美好的事物。例如,CPU生成供GPU读取的“磁带”,以便它可以为监视器写入“磁带”,以便监视器可以向用户写入“磁带”。同样,CPU可能会产生“带”为硬盘,网卡,声卡等

86

来自维基百科

以艾伦·图灵(Alan Turing)的名字命名的图灵完整性非常重要,因为到目前为止,先进的计算设备的所有合理设计都可以通过通用图灵机进行仿真,这一发现已被称为Church-Turing论文。因此,原则上可以充当通用图灵机的机器可以执行任何其他可编程计算机能够执行的任何计算。但是,这与为计算机编写程序所需的工作,计算机执行计算所花费的时间或计算机可能具有的与计算无关的任何功能无关。

虽然真正具有图灵能力的计算机在物理上很可能是不可能的,因为它们需要无限的存储空间,但是图灵的完整性通常被松散地归因于物理计算机或编程语言,如果它们具有无限的存储空间,它们将是通用的。从这个意义上说,所有现代计算机都是图灵完备的。

除了说“画图完整意味着'在足够的时间和空间下能够回答可计算的问题'”之外,我不知道您怎么能做到非技术性的。


4
在这种情况下,什么是“计算设备”?
dopatraman 2014年

30
与大多数Wikipedia文章一样,尽管该引用在技术上是正确的,但对于不了解该主题并试图理解该主题的人来说,它没有任何价值。能够正确解释事物本身就是一门科学:)
Lacho Tomov

76

非正式定义

图灵完整的语言是可以执行任何计算的语言。该教会图灵论文指出,任何可执行的计算可以通过图灵机来完成。一个图灵机是无限的随机存取存储器和有限的“程序”一台机器使然,当它应该读,写,和跨存储器移动,当它应该具有一定的成绩结束了,什么应该做的下一步。图灵机的输入在启动之前已放入其内存中。

可以使语言不图灵完成的事物

图灵机能够根据它认为在内存中的决策 - “语言”,只有支持+-*,和/对整数不是图灵完成,因为它不能使基于其输入一个选择,但图灵机多能。

Turing机器可以永远运行 -如果我们使用Java,Javascript或Python并取消了执行任何类型的循环,GOTO或函数调用的功能,那么Turing机器就不可能完整,因为它无法执行任意计算永远不会完成。Coq是一个定理证明者,不能表达不终止的程序,因此它不是图灵完整的。

Turing机器可以使用无限内存 -一种与Java完全一样的语言,但是一旦它使用了超过4 GB的内存就将终止,因为Turing机器可以使用无限内存,因此该语言不会成为Turing完整的语言。这就是为什么我们实际上不能构建图灵机的原因,但是Java仍然是图灵完整的语言,因为Java 语言没有限制,可以防止其使用无限内存。这是正则表达式未完成图灵的原因之一。

图灵机具有随机访问内存 -仅允许您通过内存进行操作push并且pop对堆栈的操作无法完成图灵的语言。如果我有一个“语言”,它只能读取一次字符串并且只能通过从堆栈中压入和弹出来使用内存,那么它可以通过在看到时压入并在看到时弹出来告诉我(字符串中的每个字符串)以后是否都有自己的内存。但是,它不能告诉我每个人以后是否都有自己的名字每个人以后是否都有自己的名字(请注意,满足此条件但不满足)。图灵机可以使用其随机存取存储器来跟踪()()[]([)]([]]()[]是单独的,但是只有堆栈的这种语言不能。

图灵机可以模拟任何其他图灵机 -当图灵机具有适当的“程序”时,可以采用另一图灵机的“程序”并在任意输入下对其进行仿真。如果您使用的语言禁止实现Python解释器,那么Turing并不是完整的。

图灵完整语言的示例

如果您的语言具有无限的随机访问内存,条件执行和某种形式的重复执行,则图灵可能已完成。还有更多异国情调的系统仍然可以实现Turing机器可以实现的所有功能,这也使它们的Turing更加完整:

  • 未分类的λ演算
  • 康威的生活游戏
  • C ++模板
  • 序言

11
SQL绝对是完整的。它具有脚本功能,可以进行任何计算。
nzifnab

53
不,您将SQL与诸如T-SQL / PL-SQL之类的扩展名混淆了。ANSI SQL并不完整。但是TSQL / PLSQL-是。
Agnius Vasiliauskas

15
显然,SQL是图灵完备的:stackoverflow.com/questions/900055/…–
Newtang

2
根据图灵完备性 -系统是图灵完整,如果它可以用来模拟任何单贴图灵机。但是在我理解的上述示例中,开发人员构建的cyclic tag system不是特定的universal cyclic tag system。因此,本文无法证明SQL Turing的完整性。(或者我误解了一些)
Agnius Vasiliauskas 2012年

2
图灵完备的语言没有可实现的实现,因为没有无限的磁带。我们真正的意思是,某些语言能够近似图灵完备性,直到主机可用内存的极限。
谢尔比·摩尔三世

17

从根本上讲,图灵完备性是一个简洁的要求,即无限制的递归。

甚至不受内存限制。

我独立地想到了这一点,但是这里是对断言的一些讨论我对LSP的定义提供了更多的上下文。

这里的其他答案没有直接定义图灵完备性的基本本质。


允许有限状态自动机具有无限递归。恰当的例子:a*

3
@Rhymoid FSM的内存有限(状态的数量有限),但是没有尾部优化的无界递归必须具有无限的内存。我并没有仅将尾部优化限制在无界递归子集中。请删除您的否决票。
谢尔比·摩尔三世

您保留了无界递归模糊的定义。您是指“原始递归”意义上的“递归”,而是通过使其成为“部分”(或“一般”或“ mu-”)而变得“无界”?那你可能是对的。但是您当前的表述过于接近大卫·哈雷尔(David Harel)的“论民间定理”中的说法。严格进行数学运算很重要,而忽略精确的定义,您就会忽略这一点。顺便说一句:FSM可以概括为交互模型。它们与TM的不同之处在于,后者的环境也已建模(如磁带)。

律类枚举是精度的对立面,例如枚举一英寸的小数的最大精度。无限递归意味着递归的所有可能形式,如果没有无限的磁带,这是不可能的。完全广义的递归(不仅仅是模型中的通用)总是图灵完备的。我要说明的是广义递归与执行任何可能的计算的能力之间的等价关系。这是一个重要的等效注意事项。
谢尔比·摩尔

“无限递归是指递归的每一个可能的形式,”这是你的阅读。对于大多数SO用户而言,“无限递归”是指while (p) { /* ... */ }。“我正在说明广义递归与执行任何可能的计算的能力之间的等效关系。” 教会的论文是一个非常不同的问题,应该真正分开讨论。

13

Turing Complete意味着它至少与Turing Machine一样强大。这意味着可以由图灵机计算的任何东西都可以由图灵完整系统计算。

没有人能找到比图灵机更强大的系统。因此,暂时说一个系统是Turing Complete就是说该系统与任何已知的计算系统一样强大(请参阅Church-Turing Thesis)。


3
请注意,所有这些都忽略了挂墙时间。它只是说“可以做到”。
托尔比约恩Ravn的安徒生

@ThorbjørnRavnAndersen实际上,它完全不考虑物理可计算性。它不仅要花费比宇宙的寿命更长的时间,而且还可能使用比用宇宙中所有费米子和玻色子所能构造的更多的内存。
Waylon Flinn

宇宙中的玻色子和费米子的数量可能没有限制。我们不知道,而且可能永远不会知道它的大小。每次您了解“宇宙”中X的数量时,人们实际上都是在谈论可观测的宇宙。尽管很有趣,但这并不是实际的物理限制。
Stijn de Witt

9

用最简单的术语来说,图灵完备系统可以解决任何可能的计算问题。

关键要求之一是暂存器大小不受限制,并且可以回退以访问先前对暂存器的写入。

因此,实际上没有系统是图灵完备的。

而是某些系统通过对无限制内存进行建模并执行适合系统内存的任何可能的计算来近似图灵完备性。


2

我认为“完成完整”概念的重要性在于能够识别可以将其过程分解为“简单”指令的计算机(不一定是机械/电气“计算机”),该指令由越来越简单的组成通用机器可以解释然后执行的指令。

我强烈推荐带注释的图灵

@Mark我认为您要解释的是通用图灵机的描述与图灵完成的描述之间的混合。

从实际意义上讲,图灵完备的东西是能够被编写并表示为程序的机器/过程/计算,并由通用机器(台式计算机)执行。正如其他人所提到的,尽管它没有考虑时间或存储空间。


2

我用简单的话理解:

图灵完成:一种可以进行计算的编程语言/程序就是图灵完成。

例如 :

  1. 您可以使用Just HTML加上两个数字吗?(答案是“ ”,您必须使用JavaScript进行加法。)因此,HTML并非图灵完成。

  2. Java,C ++,Python,Javascript,以太坊的Solidity等语言都是Turing Complete,因为您可以使用这种语言进行计算,例如将两个数字相加。

希望这可以帮助。


0

它是否可以测试和分支(具有“ if”),是否完整


1
对于这样一个古老的问题,值得检查是否其他人已经做出了类似或更实质性的贡献
alan ocallaghan

不确定答案的正确性。但这是我从未见过的非常简单的解释。有趣的事情:很久很久以前(在我写了第一段代码之后),我还使用相同的解释来定义最简单的处理器。
维克多·亚雷玛

这是一次敏锐,简洁,准确的操作定义的绝佳尝试。但是,分支必须允许循环,并且不是不是机器还必须允许子例程调用(即:递归)?每个递归程序是否都有一个扁平化的嵌套循环程序?
user3673

0

图灵机要求任何程序都可以执行条件测试。那是根本。

考虑一个钢琴演奏者。钢琴演奏者可以演奏非常复杂的音乐,但是音乐中从来没有任何条件逻辑。图灵完成了。

条件逻辑既是图灵完备机器的力量,也是危险。

保证钢琴琴每次都停止。TM不能保证。这称为“停止问题”。


-1

正如Waylon Flinn所说

Turing Complete意味着它至少与Turing Machine一样强大。

我认为这是不正确的,如果一个系统与Turing Machine一样强大,那么它就是Turing完整的系统,即该机器完成的所有计算都可以由系统完成,但系统完成的所有计算都可以由Turing机器完成。


1
我认为您是假设“转弯教堂”论点是正确的,才能得出此结论。它尚未被证实。您描述的属性称为“车削等效”。
Waylon Flinn

1
@WaylonFlinn不,他是对的。“完整度”意味着它至少与事物一样强大,但也没有更强大。与“ NP-Complete”进行比较。
Devin Jeanpierre 2012年

3
@DevinJeanpierre我不想在这里开始一场火焰大战,但我几乎可以肯定,您要描述的计算类称为“ Turing Equivalent”。图灵完成的确与NP完成具有相似的关系。当且仅当P = NP时,NP-Complete等于NP。同样,当且仅当Church-Turing论文正确时,图灵完成才等于图灵等效。
Waylon Flinn

@Waylon来源?我所读的内容均与(例如en.wikipedia.org/wiki/Turing_completeness)不同意
Devin Jeanpierre 2012年

4
@DevinJeanpierre在您链接到的维基百科文章中就这样说。引用“形式定义”部分:“一个可以计算每个图灵可计算函数的计算系统称为图灵完成”,“一个图灵完整系统被称为图灵等效项,如果它可以计算的每个函数也是图灵可计算的”
Waylon Flinn

-2

用大多数程序员熟悉的实用语言术语来说,检测Turing完整性的通常方法是该语言是否允许或允许模拟嵌套的无边界while语句(与Pascal样式的语句相对,具有固定的上限)。


1
一个单一的无限while循环就足以模拟图灵机。
masterxilo

-8

关系数据库能否输入地点和道路的纬度和经度,并计算它们之间的最短路径-否。这是一个表明SQL尚未完成图灵的问题。

但是C ++可以做到,并且可以解决任何问题。就是这样。


10
能够计算点之间的最短路径并不是图灵完整的定义。除了一个示例之外,还有很多其他功能。
伊娃

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.