什么使图灵语言完整?


79

使图灵完整的最小语言功能/结构是什么?


21
用谷歌搜索会更好吗?en.wikipedia.org/wiki/Turing_completeness
aml90

2
嗨,好奇猫,欢迎来到程序员!列表通话不在这里了:我已从您的问题中删除了该部分。就是说,这个追求非常广泛:您正在研究的特定问题是否正在考虑图灵完备性?


有关计算机科学的观点,请参见此处
拉斐尔

Answers:


73

一个图灵那tarpit是一种,其努力,以便在使用尽可能少的元素可能是图灵完备深奥的编程语言。Brainfuck也许是最著名的tarpit,但是有很多。

  • IotaJot是基于SK(I)组合器演算的函数式语言,分别具有两个和三个符号。

  • OISC一个指令集计算机)表示一种命令式计算,它仅需要一个或多个参数的指令,通常是“如果小于或等于零,则减去并分支”,或者“如果借用,则反向减去并跳过”。x86 MMU实现了前一条指令,因此是图灵完成的。

通常,要使命令式语言能够完成图灵完备,就需要:

  1. 有条件重复或有条件跳跃的一种形式(例如whileif+ goto

  2. 一种读写某种形式的存储方式(例如变量,磁带)的方法

为了使基于lambda演算的功能语言成为TC,它需要:

  1. 通过参数抽象函数的能力(例如,lambda抽象,引用)

  2. 将函数应用于参数的能力(例如,归约)

当然,还有其他查看计算的方法,但是这些是Turing tarpit的通用模型。请注意,实际计算机不是 通用的图灵机,因为它们没有无限的存储空间。严格来说,它们是“有界存储机器”。如果您要继续为它们添加内存,那么它们将渐近地向图灵机供电。但是,即使有界存储机和有限状态机对于计算也是有用的。它们根本不是通用的

严格来说,图灵完备性不需要I / O。TC仅断言某种语言可以计算所需的功能,而不能断言它可以您显示结果。实际上,每种有用的语言都有一种与世界互动的方式。


对于命令式语言,简单变量是否足够?我觉得有必要进行某种类型的收集(例如数组或链接列表)。
luiscubal 2014年

1
@luiscubal您需要能够指定任意数量的数据。使用简单变量,您可以表示变量本身具有的数据量。如果您需要表示N + 1个不同的数据,该怎么办。有人可能会说,使用Fractran游戏等技巧,即使在简单变量中也可以做到这一点……但这并不是您要的。

这不是要求语言必须支持ENDLESS循环吗?
sergiol '17

关于,“每种有用的语言都有一种与世界互动的方式。” Algol 60没有与世界互动的明确方法。Algol 60程序中的所有I / O都是通过调用库函数完成的,并且库函数在不同的实现方式上可能完全不同。但是,我在此不再讨论Algol 60是否“有用”。
所罗门慢传

15

从更实际的角度来看:如果您可以将图灵完备的语言中的所有程序翻译成您的语言,那么(据我所知),您的语言必须是图灵完备的。因此,如果要检查您设计的语言是否为图灵完备的语言,则只需将Brainf ***编写到YourLanguage编译器,并证明/证明它可以编译所有合法的BF程序。

为了澄清,我的意思是,除了要为YourLanguage解释器之外,还要编写一个编译器(使用任何语言),该编译器可以将任何BF程序编译为YourLanguage(当然保持相同的语义)。


11
是的,这绝对是解决该问题的最实用方法。</sarcasm>
罗伯特·哈维

13
@RobertHarvey有一点要说,但总体思路很重要。事实证明,Brainfuck是随语言而完善的,并且非常简单。对于非深奥的编程语言,比提供无处不在的严格证明(我可以在几行Python中实现BF,但我不确定从何处开始使用正式的证明),实施Brainfuck解释器可能更容易,更快捷。证明Python即将完成); 数十种深奥的以头脑操法为灵感的语言因其映射到大脑操法而广为人知。

7
@RobertHarvey:为什么不呢?当然,设计自己的语言的人可以为它编写BF编译器(如果必须的话,否则可以找到其他合适的语言)。
安东·戈洛夫

5
@delnan:你有但是要证明的是,你的BF解释正确实现了BF规范,督察你必须证明你的BF解释是,事实上,一个BF解释,而不是解释为BF-和语言一样,图灵完备或未必完整。
约尔格W¯¯米塔格

2
@DarekNędza,这仅仅是图灵完整性定义方式的自然结果;图灵完成语言的任何扩展仍将是图灵完成。
安东·高洛夫

8

如果一个系统可以完成通用图灵机可以做的任何事情,则该系统才可以视为图灵完整的系统。由于据说通用图灵机能够在给定的时间内解决任何可计算的功能,因此图灵完整的系统也可以做到这一点。

要检查图灵是否已完成,请查看是否可以在其中实现图灵机。换句话说,检查它是否可以模拟以下内容:

  1. 读取和写入“变量”(或任意数据)的能力:几乎可以自我解释。
  2. 模拟移动读写头的能力:仅能够检索和存储变量还不够。还必须能够模拟移动磁带磁头以引用其他变量的能力。这通常可以在编程语言中使用数组数据结构(或等效方法)进行模拟,或者在某些语言(例如机器代码)的情况下,可以通过使用“指针”(或等效方法)来引用其他变量。
  3. 模拟有限状态机的能力:尽管没有经常提及,但图灵机实际上是AI开发中经常使用的有限状态机的变体。艾伦·图灵(Alan Turing)说,状态的目的是模拟一个人的“各种解决问题的方式”。
  4. “停止”状态:尽管经常提到一组规则必须能够重复以算作图灵完成,但这并不是一个很好的标准,因为状态算法的形式化定义必须始终最终得出结论。如果他们不能以某种方式得出结论,则说明图灵不完整,或者所述算法不是可计算的函数。图灵完整的系统在技术上由于它们的工作方式而无法得出结论(例如,游戏机),因此可以通过某种方式“模拟”停止状态来克服此限制。不要与“停止问题”相混淆,后者是无法证明的功能,它证明了

这些是被视为图灵完整系统的真正最低要求。仅此而已。如果它不能以某种方式模拟其中的任何一种,则说明图灵不完整。其他人提出的方法只是最终目的,因为有些图灵完整的系统没有这些功能。

注意,没有已知的方法可以真正构建一个真正的图灵完整系统。这是因为没有一种真正的方法可以真实地模拟图灵机磁带在物理空间内的无限性。


4

如果您可以用它进行任何计算,则编程语言将完成。不仅只有一组功能可以使语言学习完整,所以回答说您需要循环或需要变量是错误的,因为有些语言既没有完成又没有完成。

艾伦·图灵(Alan Turing)制造了通用图灵机,如果您可以翻译设计为在通用机上工作的任何程序以使用您的语言运行,那么图灵也就完整了。这也可以间接起作用,因此,如果可以将用于翻译完整语言Y的所有程序都翻译为X,则可以说语言X即将完成,因为所有通用图卢姆机器程序都可以翻译为Y程序。

时间复杂度,空间复杂度,易于输入/输出格式以及易于编写任何程序均不包含在方程式中,因此,如果计算不受功率损耗或地球被太阳吞没的影响,则该机器理论上可以进行所有计算。

通常,为了证明图文的完整性,他们会为任何证明是图文的完整语言提供解释器,但是要使其正常工作,您需要输入和输出的方式,这对于语言图文完整来说实际上并不需要两件事。程序可以在启动时更改其状态,并且可以在程序停止后检查内存。

要使语言成功,它不仅需要完整,而且甚至适用于tarpit。我不认为BrainFuck在没有,和的情况下不会流行.


2
“如果您可以使用任何一种计算语言,那它就已经构成了一种完整的编程语言。” 那是Church-Turing论文,而不是使图灵语言完整的原因。
Rhymoid

@Rhymoid所以,您的意思是除非您可以翻译,否则所有内容都无法完成吗?就是 lambda演算即使在相等时也未完成?
Sylwester 2014年

1
我仍在寻找术语“图灵等效”和“图灵完备”(以及“图灵强大”)的权威定义。我已经看到过很多案例,从留言板上的人到他们自己的原始论文中的研究人员,他们对这些术语的理解不同。
Rhymoid

无论如何,我将“图灵完成”解释为等同于通用图灵机(UTM;它能够模拟任何图灵机-因此是“通用”)的模拟。在Turing在1936年发表的论文中,他介绍了他的机器,他定义了UTM的概念,并给出了证明UTM等效于Church的lambda微积分的证明的草图。通过这样做,他证明了它们具有相同的计算能力。简单地说,Church-Turing论文断言“这就是您将获得的所有计算能力”。
Rhymoid 2014年

它对Wikipedia的Turing完整性页面有两个正式定义。一个不需要I / O,另一个不需要。如果机器可以计算每个可计算图灵的函数,则它并不表示机器即将完成。由于您可以轻松地在lambda演算中编写一个等效程序,该程序的计算结果与图灵机程序的计算结果相同,因此这使lambda演算恢复到完整的演奏阶段。
Sylwester

4

您无法判断它会无限循环还是停止。

-------------

说明:有了一些输入,就不可能在任何情况下(使用另一台Turing机器)告诉事物是否将无限循环或最终将停止,除非运行它(如果它确实停止了,它会给您答案,但不能运行)如果循环!)。

这意味着您必须能够以某种方式存储可能无限量的数据-无论卷积多么复杂,都必须有与无限磁带等效的数据!(否则,只有有限数量的状态,然后您可以检查您以前是否经历过该状态并最终停止)。通常,图灵机可以通过某些可控制的方式来增大或缩小其状态的大小。

由于图灵原始的通用图灵机存在无法解决的停机问题,因此您自己的图灵完整机器也必须具有无法解决的停机问题。

Turing完整系统可以模拟任何其他Turing完整系统,因此,如果您可以在系统中为某个知名的Turing完整系统构建仿真器,则证明您的系统也是Turing完整的。

例如,假设给定的板具有无限重复的网格图案(顶部和左侧具有不同的版本),则假设您要证明Snakes&Ladders是Turing完整的。知道2计数器Minsky机器是图灵完成的(具有2个无限制计数器和1个有限数量的状态),您可以构造一个等效板,其中网格上X和Y位置是2个计数器的当前值并且当前路径是当前状态。砰! 您刚刚证明了蛇和梯子已经完成。


1
我不赞成这种说法。仅仅是因为Turing机器的死机问题是无法确定的,并不直接表示每个允许您指定无法确定死机问题的程序的符号都已经完成了Turing。显然只有相反的事实是正确的:如果符号是图灵完成的,那么当然可以编写无法确定停止问题的程序。
5gon12eder 2015年

这是必要条件。如果您可以为每个程序决定是否暂停,则该语言不是图灵完成的。
gnasher729

4

一个必要条件是循环次数最多的循环,该循环在迭代之前未确定,或者在递归中未预先确定最大递归深度。举个例子,对... ...在循环,你发现他们在许多新的语言是不是足以让语言图灵完备的(但他们将有其他方式)。请注意,这并不意味着有限的迭代次数或有限的递归深度,而是必须提前计算最大的迭代次数和递归深度。

例如,如果没有这些功能,就无法用一种语言来计算Ackermann函数。另一方面,不需要这些功能就可以编写许多高度复杂且非常有用的软件。

另一方面,通过预先计算每个迭代计数和每个递归深度,不仅可以决定程序是否停止,而且可以停止。


-1

我知道这不是形式上正确的答案,但是一旦您从“ Turing-complete”中剔除了“ minimal”并把“ practical”放回了它所属的位置,您将看到最重要的功能,它们将编程语言与标记语言是

  • 变数
  • 有条件的(如果/然后...)
  • 循环(循环/中断,而...)

接下来来

  • 匿名和命名函数

为了测试这些断言,首先要使用一种标记语言,例如HTML。我们可以发明一种仅包含变量或仅具有条件的HTML +(MS使用条件注释来做到这一点),或某种循环构造(在没有条件的情况下最终可能会变成类似<repeat n='4'>...</repeat>)。进行上述任何一项操作,都将使HTML +比普通HTML更加强大(?),但与编程语言相比,它更像是一种标记;使用每个新功能,您将使它不再是声明式语言,而更多是命令式语言。

追求逻辑和编程上的最低限度的追求固然重要且有趣,但是如果我要教年轻或年老的n00bies“什么是编程”和“如何学习编程”,我几乎不会从全面和广度入手图灵完备性的理论基础。烹饪和编程的全部精髓是按照正确的顺序进行操作,直到妈妈准备好为止,重复进行直到准备就绪。关于我的总结。

再说一次,我从未完成我的CS。


2
如果不确定,则应首先进行研究。 fractran正在完善brainf * ck也是如此。另请注意,由于html 5 + CSS 3可以实现规则110,因此它们是Turing完整的。

1
是的,我知道。但是给出的所有示例或多或少都是深奥的(虽然可能很有趣或令人惊讶),但我的回答是务实的,很可能根本不是最小的。我认为必须指出这一点很重要-当在Google上搜索图灵完备性时,此页面是#1,这里的答案对IMHO没什么用,例如,一个n00bie想要知道HTML与PHP或Python有何区别。我的意思是,brainf ck无缘无故不被称为brainf ck。
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.