ChatGPT解决这个技术问题 Extra ChatGPT

什么是图灵完备?

“图灵完备”的表达是什么意思?

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

this SO question 上的一些非常好的链接。
...什么不是 TC。干杯~

M
Mark Harrison

这是最简短的解释:

图灵完备系统是指可以编写程序并找到答案的系统(尽管不保证运行时或内存)。

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

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


如需进一步阅读,请参阅带注释的图灵。非常平易近人。 amazon.com/Annotated-Turing-Through-Historic-Computability/dp/…
“经常不在实践中”是不正确的。在实践中没有一个系统是图灵完备的,因为没有一个可实现的系统具有无限的磁带。我们真正的意思是,某些系统能够将图灵完备性逼近到其可用内存的极限。
但是 Vi 是世界上唯一需要的计算引擎...... ;-)
Emacs 也是车床吗? XD
最近有人表明 PowerPoint 也是图灵完备的。
P
Prithvi Boinpally

这是最简单的解释

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

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

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

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

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


当我记得图灵和其他早期计算机科学家每次想要解决特定问题时都会制造特定机器时,这种机器甚至会有一个术语的想法更有意义。我们已经习惯了一台可以永远重新编程的机器。谢谢你的上下文,拉贾。
JavaScript 如何实现图灵完备?它缺少文件系统、适当的多线程 API。它有很多限制,主要是由于它的浏览器安全沙箱性质。它几乎不能被称为“一种编程语言”。看看有多少脚本抽象的变体存在(反应,打字稿..你的名字),所有这些都是为了弥补 JS 没有的东西。 (这里应该提到 asm.js)。 Java、Python 或 C++ 是真正的“图灵完备”示例。但是js?我不这么认为。
@MichaelIV 巡回机器也没有文件系统/线程。 JS 绝对巡演完毕。
@MichaelIV 为了补充 Bax 的回应,人们可以考虑一台现代计算机,它由几台图灵机组成,它们协同工作以实现您提到的所有这些好东西。例如,CPU 生成“磁带”供 GPU 读取,以便它可以为监视器写入“磁带”,以便监视器可以向用户写入“磁带”。同样,CPU 可以为硬盘驱动器、网卡、声卡等生产“磁带”。
JS 绝对是图灵完备的——但图灵完备的标准比你想象的要低。这并不意味着它对于任何计算都是最佳的。例如:如果一种语言可以添加数字、循环和执行条件语句,则它不需要能够将数字相乘来实现图灵完备。它是图灵完备的,因为您可以编写一个函数来将数字与其他功能相乘。
G
Gordon Gustafson

非正式定义

图灵完备的语言是一种可以执行任何计算的语言。 Church-Turing Thesis 表明任何可执行的计算都可以由图灵机完成。 Turing machine 是一台具有无限随机存取存储器和有限“程序”的机器,它规定了它应该何时读取、写入和在该内存中移动,何时应该以特定结果终止,以及下一步应该做什么。图灵机的输入在它启动之前被放入它的内存中。

可以使语言不是图灵完整的事情

图灵机可以根据它在内存中看到的内容做出决定 - 仅支持整数 +-*/ 的“语言”不是图灵完备的因为它无法根据输入做出选择,但图灵机可以。

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

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

图灵机具有随机存取内存 - 仅允许您通过对堆栈的 pushpop 操作使用内存的语言不会是图灵完备的。如果我有一种“语言”可以读取字符串一次,并且只能通过从堆栈中推送和弹出来使用内存,它可以告诉我字符串中的每个 ( 是否都有自己的 )稍后通过在看到 ( 时按下并在看到 ) 时弹出。但是,它无法告诉我以后是否每个 ( 都有自己的 )并且每个 [ 以后都有自己的 ](请注意,([)] 符合此条件但 ([]] 没有)。图灵机可以使用其随机存取存储器分别跟踪 ()[],但这种只有堆栈的语言不能。

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

图灵完备语言示例

如果您的语言具有无限的随机存取内存、条件执行和某种形式的重复执行,那么它可能是图灵完备的。还有更多奇特的系统仍然可以实现图灵机所能做到的一切,这也使它们图灵完备:

无类型 lambda 演算

康威的人生游戏

C++ 模板

序言


SQL 绝对是图灵完备的。它具有允许任何计算的脚本功能。
不,您将 SQL 与 T-SQL / PL-SQL 等扩展混淆了。 ANSI SQL 不是图灵完备的。但是 TSQL / PLSQL - 是。
显然 SQL 是图灵完备的:stackoverflow.com/questions/900055/…
根据turing completeness - 如果系统可用于模拟任何单带图灵机,则系统是图灵完备的。但是在上面的示例中,据我了解,开发人员构建了特定的 cyclic tag system 而不是 universal cyclic tag system。因此 - 文章并不能证明 SQL 图灵完备。 (或者我误解了什么)
没有图灵完备语言的可实现的实现,因为没有无限的磁带。我们真正的意思是,某些语言能够将图灵完备性逼近到主机可用内存的限制。
R
Ran Biron

wikipedia

以艾伦·图灵命名的图灵完备性意义重大,因为迄今为止先进的计算设备的每一个合理设计都可以由通用图灵机模拟——这一观察已被称为 Church-Turing 论点。因此,可以作为通用图灵机的机器原则上可以执行任何其他可编程计算机能够执行的任何计算。然而,这与为机器编写程序所需的努力、机器执行计算所需的时间或机器可能拥有的与计算无关的任何能力无关。虽然真正的图灵完备机器在物理上很可能是不可能的,因为它们需要无限的存储空间,但图灵完备性通常被松散地归因于物理机器或编程语言,如果它们具有无限的存储空间,它们将是通用的。从这个意义上说,所有现代计算机都是图灵完备的。

我不知道你怎么能比这更非技术性,除了说“图灵完整意味着'能够在足够的时间和空间下回答可计算的问题'”。


在这种情况下,什么是“计算设备”?
与大多数 Wikipedia 文章一样,虽然这句话在技术上是正确的,但对于不了解该主题并试图理解它的人来说,它没有任何价值。能够正确解释事物本身就是一门科学:)
C
Community

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

甚至不受记忆的限制。

我独立地想到了这一点,但here is some discussion的断言。 My definition of LSP 提供更多上下文。

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


有限状态自动机允许无限递归。例如:a*
@Rhymoid FSM have limited memory——有限的状态数)——但是没有尾优化的无限递归必须有无限的内存。我没有将我的定义限制在无界递归的子集上,只有尾部优化。请删除您的反对票。
您使无限递归的定义模糊不清。您是指“原始递归”意义上的“递归”,还是通过使其“部分”(或“一般”或“mu-”)来表示“无界”?那么你可能是对的。但是你目前的表述与大卫哈雷尔的“关于民间定理”中批评的陈述太接近了。在数学上保持严谨很重要,而忽略精确的定义,你就忽略了这一点。顺便说一句:FSM 可以推广到模型交互;它们与 TM 的不同之处在于后者的环境也被建模(如磁带)。
@Rhymoid 枚举是精度的对立面,例如枚举一英寸小数的最大精度。无限递归意味着所有可能的递归形式,如果没有无限的磁带,这是不可能的。完全泛化的递归(不仅仅是模型内的泛化)总是图灵完备的。我在说明广义递归与执行任何可能计算的能力之间的等价性。这是一个需要注意的重要等价物。
“无限递归意味着所有可能的递归形式”这是你的读物。对于大多数 SO 用户来说,“无限递归”意味着 while (p) { /* ... */ }。 “我是在说明广义递归与执行任何可能计算的能力之间的等价性。” Church 的论文是一个非常不同的问题,应该真的单独讨论。
W
Waylon Flinn

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

还没有人找到比图灵机更强大的系统。因此,就目前而言,说一个系统是图灵完备的就等于说该系统与任何已知的计算系统一样强大(参见 Church-Turing Thesis)。


请注意,所有这些都忽略了挂墙时间。它只是说“可以做到”。
@ThorbjørnRavnAndersen 实际上,它完全无视物理可计算性。它不仅需要比宇宙的年龄更长的时间,而且还可能使用比宇宙中所有费米子和玻色子所能构建的更多的内存。
宇宙中玻色子和费米子的数量很可能没有限制。我们不知道,也可能永远不会知道它的大小。每次你读到“宇宙”中 X 的数量时,人们实际上都在谈论可观测的宇宙。虽然很有趣,但这并不是一个实际的物理限制。
通常通过强大的人理解“快速计算”(一个放在复杂性旁边的概念(复杂性理论)),如果一个 TM 完成,它就是完整的(可计算的(可计算性理论))。由于近似或错误的措辞,如果没有错误,这个答案会产生误导。
S
Shelby Moore III

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

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

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

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


a
alex

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

我强烈推荐带注释的图灵

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

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


G
Glenn Mohammad

Brasilford 教授在此 video 中解释的内容的超级简短摘要。

图灵完备 ≅ 做图灵机能做的任何事情。

它有条件分支(即“if 语句”)。此外,暗示“去”,从而允许循环。它获得程序所需的任意数量的内存(例如足够长的磁带)。


K
Keith Douglas

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


单个无界 while 循环足以模拟图灵机。
2
2 revs, 2 users 97%

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

考虑一个播放器钢琴卷。自动钢琴可以演奏一首高度复杂的音乐,但音乐中从来没有任何条件逻辑。它不是图灵完备的。

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

保证钢琴卷帘每次都停止。 TM 没有这样的保证。这被称为“停机问题”。


P
Patrick87

我们称一种语言为图灵完备的当且仅当 (1) 它可由图灵机判定,但 (2) 不能由比图灵机能力差的任何事物判定。例如,字母表 {a, b} 上的回文语言可由图灵机判定,但也可由下推自动机判定;所以,这种语言不是图灵完备的。真正图灵完备的语言——需要图灵机的全部计算能力的语言——非常罕见。也许是字符串 xyz 的语言,其中 x 是数字,y 是图灵机,z 是初始磁带配置,并且 y 在不到 x 的时间内停止在 z 上!步骤 - 也许符合条件(尽管需要显示!)

一个常见的不精确用法混淆了图灵完备性和图灵等效性。图灵等价性是指计算系统可以模拟并且可以由图灵机模拟的属性。例如,我们可以说 Java 是一种图灵等效的编程语言,因为您可以用 Java 编写图灵机模拟器,并且因为您可以定义一个图灵机来模拟 Java 程序的执行。根据 Church-Turing 论文,图灵机可以执行任何有效的计算,因此 Turing 等价意味着系统尽可能有能力(如果 Church-Turing 论文是真的!)

图灵等价是比真正的图灵完备性更主流的关注点。这个以及“完整”比“等效”更短的事实可以解释为什么“图灵完整”经常被误用来表示图灵等效,但我离题了。


C
Community

作为Waylon Flinn said

图灵完备意味着它至少和图灵机一样强大。

我认为这是不正确的,如果一个系统与图灵机一样强大,那么它就是图灵完备的,即机器完成的每个计算都可以由系统完成,而且系统完成的每个计算也可以由图灵机完成.


我认为您是在假设 Church-Turing 论文是正确的,才能得出这个结论。它还有待证明。您描述的属性称为“图灵等效”。
@WaylonFlinn 不,他是对的。 “完整”既意味着它至少和一个东西一样强大,也意味着它没有更强。与“NP-Complete”进行比较。
@DevinJeanpierre我不想在这里开始一场激烈的战争,但我几乎可以肯定你所描述的计算类被称为“图灵等效”。 Turing Complete 确实与 NP-Complete 有类似的关系。当且仅当 P=NP 时,NP-Complete 等于 NP。同样,当且仅当 Church-Turing 命题正确时,图灵完备等于图灵等效。
@Waylon 来源?我读到的任何内容都不同意(例如 en.wikipedia.org/wiki/Turing_completeness
@DevinJeanpierre 它在您链接到的维基百科文章中说。引用正式定义部分:“可以计算每个图灵可计算函数的计算系统称为图灵完备”,“如果它可以计算的每个函数也是图灵可计算的,则图灵完备系统称为图灵等效”
A
Akshay Jain

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

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


能够计算点之间的最短路径并不是图灵完备的定义。它不仅仅是一个例子。