我一直在网上搜索,我发现有些矛盾的答案。一些消息来源声称,当且仅当它具有两者有条件和无条件分支(我认为有点多余)时,语言/机器/什么是图灵完成,有人说这只是无条件的是必需的,其他只需要有条件的。
德国Z3(显示在5月份工作 1941年)由Konrad Zuse设计。它 是第一个通用数字 电脑,但确实如此 机电的,而不是 电子,因为它使用了所有的继电器 功能。它使用逻辑计算 二进制数学。它是可编程的 穿孔带,但没有 条件分支。虽然没有设计 对于图灵完整性,它 不小心被发现了 在1998年(但要利用这个 图灵完整,复杂,聪明 黑客是必要的。)
究竟是什么复杂,聪明的黑客?
1998年的论文摘要R.Rojas也指出(请注意,我没有读过这篇论文,它只是IEEE的一个片段。):
计算机Z3,由 Konrad Zuse于1938年至1941年间, 只能执行固定序列 浮点算术运算 (加法,减法, 乘法,除法和平方 root)用穿孔带编码。一个 有趣的问题要问,从 计算史的观点, 是否这些操作 足以进行通用计算。 论文表明,实际上是一个 包含这些的单程序循环 算术指令可以模拟 任何图灵机的磁带是 给定有限大小。这是通过 模拟条件分支和 纯粹的间接寻址 算术手段。 Zuse的Z3是 因此,至少在原则上,如 普遍作为今天的计算机 有一个有限的寻址空间。
简而言之,SOers,Turing-completeness究竟需要什么类型的分支?假设无限记忆,只有goto
或jmp
分支构造(没有if
或jnz
构造)的语言是否可以被视为图灵完备?
答案 0 :(得分:10)
可以找到原始的Rojas论文here。基本思想是Z3仅支持无条件单循环(通过将指令磁带的末端粘合在一起)。您可以通过在循环中一个接一个地放置所有代码部分来构建它的条件执行,并使用变量z来确定要执行的部分。在第j节的开头,你设置
if (z==j) then t=0 else t=1
然后在本节中将每个作业a = b op c
读取
a = a*t + (b op c)*(1-t)
(即每项任务都是无操作,但在活动部分除外)。现在,这还包括一个条件赋值:如何比较z == j?他建议使用z(z1..zm)的二进制表示以及j(c1..cm)的否定二进制表示,然后计算
t = 1 - sqr((c1-z1)(c2-z2)...(cm-zm))
如果c和z在所有位上不同,则此产品将为1,仅当z == j时才会发生。对z的赋值(基本上是间接跳转)也必须分配给z1..zm。
罗哈斯也写过Conditional Branching is not Necessary for Universal Computation in von Neumann Computers。在那里,他提出了一个具有自修改代码和相对寻址的机器,以便您可以从内存中读取图灵指令,并修改程序以相应地跳转。作为替代方案,他提出了上述方法(对于Z3),在仅使用LOAD(A),STORE(A),INC和DEC的版本中。
答案 1 :(得分:4)
如果只有算术表达式,则可以使用算术运算的某些属性。例如,A
是0或1,取决于某些条件(先前已计算),然后A*B+(1-A)*C
计算表达式if A then B else C
。
答案 2 :(得分:3)
你需要能够基于(结果)输入分支的东西。
模拟条件分支的一种方法是使用自修改代码 - 您进行计算,将其结果存入正在执行的指令流中。您可以将op-code用于无条件跳转到指令流中,并对输入进行数学运算,以根据输入的某些条件设置该跳转的正确目标。例如,从y中减去x,如果是正数,则向右移动到0-fill,如果是负数,则向右移动到0-fill,然后添加基址,并在jmp操作码之后立即存储该结果。当你到达那个jmp时,如果x == y,你会去一个地址,如果是x!= y,你会去另一个地址。
答案 3 :(得分:2)
如果您可以计算goto
或jmp
的地址,则可以模拟arbritary条件。我偶尔用它来模拟ZX Basic中的“ON x GOTO a,b,c”。
如果“true”的数值为1且“false”为0,那么结构如下:
if A then goto B else goto C
与:
相同goto C+(B-C)*A
所以,是的,使用“计算goto”或自我修改的能力,goto或jmp可以作为条件。
答案 4 :(得分:1)
从抽象的角度来看,Z3只是图灵完成。你可以有一个任意长的程序磁带,只需计算每个条件分支的两边。换句话说,对于每个分支,它将计算两个答案并告诉您忽略哪一个。显然,这会为您拥有的每个条件分支创建指数级更大的程序,因此您永远不能以图灵完备的方式使用此计算机。
答案 5 :(得分:1)
您不需要条件分支来构建图灵完备机器,但当然任何图灵完备机器都将提供条件分支作为核心功能。
事实证明,像Rule 110 Cellular Automaton这样简单的系统可用于实现图灵机。您肯定不需要条件分支来从位桶中提取这样的系统。实际上可以使用a bunch of rocks。
关键在于图灵机将提供条件分支,因此通过证明图灵完整性你所做的事情在某种程度上实现了条件分支。你必须在某些时候没有条件分支,无论是岩石还是半导体中的PN结。
答案 6 :(得分:1)
如果机器可以分支,那么是的,它被视为图灵完成。
原因是条件分支自动使任何计算机图灵完成。但是,也有机器不能跳转分支甚至IF,但仍然认为图灵完成。
处理只是识别输入以便选择输出的过程。
分支是一种理解这个过程的方法,跳转的条件是可以对输入进行分类的条件,你分支的位置可以存储该输入的正确输出。
最后,澄清事情:
如果您有条件分支,您的计算机必然在计算上等同于图灵机。但是,计算机有很多其他方法可以实现图灵完整性(lambda,IF,CL)。