什么是图灵完成?

问题描述 投票:438回答:12

“图灵完成”的含义是什么意思?

你可以给出一个简单的解释,而不会涉及太多的理论细节吗?

theory turing-machines turing-complete
12个回答
276
投票

这是最简短的解释:

图灵完整系统是指一个系统,在该系统中可以编写一个程序来找到答案(尽管不保证运行时或内存)。

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

有时这是一个笑话......一个人在vi中写了一个图灵机模拟器,所以可以说vi是世界上唯一需要的计算引擎。


-1
投票

作为Waylon Flinn said

图灵完成意味着它至少与图灵机一样强大。

我认为这是不正确的,如果它与图灵机一样强大,系统就是图灵完成,即机器完成的每一次计算都可以由系统完成,而且系统完成的每一次计算都可以通过图灵机来完成。 。


-2
投票

在大多数程序员熟悉的实用语言术语中,检测图灵完整性的常用方法是语言是否允许或允许模拟嵌套的无界while语句(与语句的Pascal风格相反,具有固定的上限)。


-8
投票

关系数据库可以输入地点和道路的纬度和经度,并计算它们之间的最短路径 - 没有。这是一个问题,表明SQL不是图灵完整的。

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


157
投票

这是最简单的解释

Alan Turing创建了一台可以接受程序,运行该程序并显示一些结果的机器。但他必须为不同的程序创建不同的机器。所以他创造了“通用图灵机”,可以接受任何程序并运行它。

编程语言与那些机器类似(尽管是虚拟的)。他们接受程序并运行它们。现在,编程语言被称为“图灵完成”,如果它可以运行任何程序(不论语言)图灵机可以运行给定足够的时间和内存。

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

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

更新:您可以在我的博客文章中了解更多信息:"JavaScript Is Turing Complete" — Explained


86
投票

来自wikipedia

以阿兰图灵命名的图灵完整性非常重要,因为迄今为止先进的计算设备的每一个合理的设计都可以通过一个通用的图灵机来模仿 - 这一观察被称为Church-Turing论文。因此,可以充当通用图灵机的机器原则上可以执行任何其他可编程计算机能够进行的任何计算。然而,这与为机器编写程序所需的努力,机器执行计算所花费的时间或机器可能具有的与计算无关的任何能力无关。

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

我不知道你怎么能比那更具技术性,除非说“图灵完整的手段'能够在给定足够的时间和空间的情况下回答可计算的问题”。


61
投票

非正式定义

图灵完整语言是可以执行任何计算的语言。 Church-Turing Thesis声明任何可执行的计算都可以由图灵机完成。 Turing machine是一台具有无限随机存取存储器和有限“程序”的机器,它指示何时应该读取,写入和移动该存储器,何时应该以某个结果终止,以及接下来应该做什么。图灵机的输入在启动前放入其内存中。

可以使语言无法完成的事情

图灵机可以根据它在内存中看到的内容做出决定 - 只支持整数的+-*/的'语言'不是图灵完整的,因为它不能根据其输入做出选择,而是图灵机可以。

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

图灵机可以使用无限内存 - 一种与Java完全相同的语言,但是一旦使用超过4千兆字节的内存就会终止,因为图灵机可以使用无限内存。这就是我们实际上无法构建图灵机的原因,但Java仍然是图灵完整语言,因为Java语言没有限制它阻止它使用无限内存。这是正则表达式不是图灵完成的一个原因。

图灵机具有随机存取存储器 - 这种语言只允许你通过pushpop操作处理堆栈的内存不会图灵完成。如果我有一个只读一次字符串的'语言'并且只能通过从堆栈中推出和弹出来使用内存,那么它可以告诉我字符串中的每个(是否都有自己的),当它看到(时弹出并弹出它看到了)。然而,它不能告诉我,如果每个(后来都有自己的),并且每个[后来都有自己的](请注意([)]符合此标准,但([]]没有)。图灵机可以使用其随机存取存储器分别跟踪()[],但这种只有堆栈的语言不能。

图灵机可以模拟任何其他图灵机 - 图灵机,当给定适当的'程序'时,可以采用另一个图灵机的'程序'并在任意输入上模拟它。如果你有一种被禁止实现Python解释器的语言,它就不会是图灵完成的。

图灵完整语言的例子

如果您的语言具有无限的随机存取存储器,条件执行和某种形式的重复执行,则可能是图灵完成的。有更多的奇特系统仍然可以实现图灵机所能实现的一切,这也使得图灵完成了:

  • 没有类型的lambda演算
  • 康威的生活游戏
  • C ++模板
  • 序言

15
投票

从根本上说,图灵完整性是一个简洁的要求,无限的递归。

甚至没有记忆的限制。

我独立地想到了这个,但here is some discussion的断言。 My definition of LSP提供更多背景信息。

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


11
投票

图灵完全意味着它至少与Turing Machine一样强大。这意味着图灵机可以计算的任何东西都可以通过图灵完备系统来计算。

还没有人发现一个比图灵机更强大的系统。因此,暂时说系统是Turing Complete就像说系统和任何已知的计算系统一样强大(参见Church-Turing Thesis)。


8
投票

简而言之,图灵完备系统可以解决任何可能的计算问题。

其中一个关键要求是暂存区域大小无限制,可以倒带以访问先前写入暂存器的内容。

因此在实践中没有系统是图灵完备的。

相反,一些系统通过对无界内存进行建模并执行可适合系统内存的任何可能计算来近似图灵完备性。


2
投票

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

我强烈推荐The Annotated Turing

@Mark我认为你所解释的是通用图灵机和图灵完成之间的混合。

在实际意义上,图灵完成的东西将是能够被编写并表示为程序的机器/过程/计算,由通用机器(台式计算机)执行。虽然没有考虑时间或存储,但正如其他人所提到的那样。


2
投票

我用简单的话来理解:

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

例如 :

  1. 你能用Just HTML添加两个数字吗? (并且'不',你必须使用javascript来执行添加。)因此HTML不是图灵完成。
  2. Java,C ++,Python,Javascript,Ethereum的Solidity等语言都是Turing Complete,因为您可以使用这些语言添加两个数字进行计算。

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.