Answers:
一个图灵那tarpit是一种,其努力,以便在使用尽可能少的元素可能是图灵完备深奥的编程语言。Brainfuck也许是最著名的tarpit,但是有很多。
Iota和Jot是基于SK(I)组合器演算的函数式语言,分别具有两个和三个符号。
OISC(一个指令集计算机)表示一种命令式计算,它仅需要一个或多个参数的指令,通常是“如果小于或等于零,则减去并分支”,或者“如果借用,则反向减去并跳过”。x86 MMU实现了前一条指令,因此是图灵完成的。
通常,要使命令式语言能够完成图灵完备,就需要:
有条件重复或有条件跳跃的一种形式(例如while
,if
+ goto
)
一种读写某种形式的存储方式(例如变量,磁带)的方法
为了使基于lambda演算的功能语言成为TC,它需要:
通过参数抽象函数的能力(例如,lambda抽象,引用)
将函数应用于参数的能力(例如,归约)
当然,还有其他查看计算的方法,但是这些是Turing tarpit的通用模型。请注意,实际计算机不是 通用的图灵机,因为它们没有无限的存储空间。严格来说,它们是“有界存储机器”。如果您要继续为它们添加内存,那么它们将渐近地向图灵机供电。但是,即使有界存储机和有限状态机对于计算也是有用的。它们根本不是通用的。
严格来说,图灵完备性不需要I / O。TC仅断言某种语言可以计算所需的功能,而不能断言它可以向您显示结果。实际上,每种有用的语言都有一种与世界互动的方式。
从更实际的角度来看:如果您可以将图灵完备的语言中的所有程序翻译成您的语言,那么(据我所知),您的语言必须是图灵完备的。因此,如果要检查您设计的语言是否为图灵完备的语言,则只需将Brainf ***编写到YourLanguage编译器,并证明/证明它可以编译所有合法的BF程序。
为了澄清,我的意思是,除了要为YourLanguage解释器之外,还要编写一个编译器(使用任何语言),该编译器可以将任何BF程序编译为YourLanguage(当然保持相同的语义)。
</sarcasm>
如果一个系统可以完成通用图灵机可以做的任何事情,则该系统才可以视为图灵完整的系统。由于据说通用图灵机能够在给定的时间内解决任何可计算的功能,因此图灵完整的系统也可以做到这一点。
要检查图灵是否已完成,请查看是否可以在其中实现图灵机。换句话说,检查它是否可以模拟以下内容:
这些是被视为图灵完整系统的真正最低要求。仅此而已。如果它不能以某种方式模拟其中的任何一种,则说明图灵不完整。其他人提出的方法只是最终目的,因为有些图灵完整的系统没有这些功能。
注意,没有已知的方法可以真正构建一个真正的图灵完整系统。这是因为没有一种真正的方法可以真实地模拟图灵机磁带在物理空间内的无限性。
如果您可以用它进行任何计算,则编程语言将完成。不仅只有一组功能可以使语言学习完整,所以回答说您需要循环或需要变量是错误的,因为有些语言既没有完成又没有完成。
艾伦·图灵(Alan Turing)制造了通用图灵机,如果您可以翻译设计为在通用机上工作的任何程序以使用您的语言运行,那么图灵也就完整了。这也可以间接起作用,因此,如果可以将用于翻译完整语言Y的所有程序都翻译为X,则可以说语言X即将完成,因为所有通用图卢姆机器程序都可以翻译为Y程序。
时间复杂度,空间复杂度,易于输入/输出格式以及易于编写任何程序均不包含在方程式中,因此,如果计算不受功率损耗或地球被太阳吞没的影响,则该机器理论上可以进行所有计算。
通常,为了证明图文的完整性,他们会为任何证明是图文的完整语言提供解释器,但是要使其正常工作,您需要输入和输出的方式,这对于语言图文完整来说实际上并不需要两件事。程序可以在启动时更改其状态,并且可以在程序停止后检查内存。
要使语言成功,它不仅需要完整,而且甚至适用于tarpit。我不认为BrainFuck在没有,
和的情况下不会流行.
。
您无法判断它会无限循环还是停止。
说明:有了一些输入,就不可能在任何情况下(使用另一台Turing机器)告诉事物是否将无限循环或最终将停止,除非运行它(如果它确实停止了,它会给您答案,但不能运行)如果循环!)。
这意味着您必须能够以某种方式存储可能无限量的数据-无论卷积多么复杂,都必须有与无限磁带等效的数据!(否则,只有有限数量的状态,然后您可以检查您以前是否经历过该状态并最终停止)。通常,图灵机可以通过某些可控制的方式来增大或缩小其状态的大小。
由于图灵原始的通用图灵机存在无法解决的停机问题,因此您自己的图灵完整机器也必须具有无法解决的停机问题。
Turing完整系统可以模拟任何其他Turing完整系统,因此,如果您可以在系统中为某个知名的Turing完整系统构建仿真器,则证明您的系统也是Turing完整的。
例如,假设给定的板具有无限重复的网格图案(顶部和左侧具有不同的版本),则假设您要证明Snakes&Ladders是Turing完整的。知道2计数器Minsky机器是图灵完成的(具有2个无限制计数器和1个有限数量的状态),您可以构造一个等效板,其中网格上X和Y位置是2个计数器的当前值并且当前路径是当前状态。砰! 您刚刚证明了蛇和梯子已经完成。
一个必要条件是循环次数最多的循环,该循环在迭代之前未确定,或者在递归中未预先确定最大递归深度。举个例子,对... ...在循环,你发现他们在许多新的语言是不是足以让语言图灵完备的(但他们将有其他方式)。请注意,这并不意味着有限的迭代次数或有限的递归深度,而是必须提前计算最大的迭代次数和递归深度。
例如,如果没有这些功能,就无法用一种语言来计算Ackermann函数。另一方面,不需要这些功能就可以编写许多高度复杂且非常有用的软件。
另一方面,通过预先计算每个迭代计数和每个递归深度,不仅可以决定程序是否停止,而且可以停止。
我知道这不是形式上正确的答案,但是一旦您从“ Turing-complete”中剔除了“ minimal”并把“ practical”放回了它所属的位置,您将看到最重要的功能,它们将编程语言与标记语言是
接下来来
为了测试这些断言,首先要使用一种标记语言,例如HTML。我们可以发明一种仅包含变量或仅具有条件的HTML +(MS使用条件注释来做到这一点),或某种循环构造(在没有条件的情况下最终可能会变成类似<repeat n='4'>...</repeat>
)。进行上述任何一项操作,都将使HTML +比普通HTML更加强大(?),但与编程语言相比,它更像是一种标记;使用每个新功能,您将使它不再是声明式语言,而更多是命令式语言。
追求逻辑和编程上的最低限度的追求固然重要且有趣,但是如果我要教年轻或年老的n00bies“什么是编程”和“如何学习编程”,我几乎不会从全面和广度入手图灵完备性的理论基础。烹饪和编程的全部精髓是按照正确的顺序进行操作,直到妈妈准备好为止,重复进行直到准备就绪。关于我的总结。
再说一次,我从未完成我的CS。