【问题标题】:Is conditional branching a requirement of Turing-completeness?条件分支是图灵完备性的要求吗?
【发布时间】:2011-05-01 02:17:10
【问题描述】:

我一直在网上搜索,但我发现有些矛盾的答案。一些消息来源断言,当且仅当它具有 both 条件和无条件分支(我猜这有点多余)时,语言/机器/你有什么是图灵完备的,有人说只有无条件是必需的,其他只需要条件的。

阅读德国人Z3ENIAC,维基百科说:

德国 Z3(显示在 5 月工作 1941)由康拉德·祖泽设计。它 是第一个通用数字 电脑,但它是 机电,而不是 电子的,因为它使用了所有继电器 职能。它使用逻辑计算 二进制数学。它是可编程的 打孔胶带,但缺乏 条件分支。虽然没有设计 对于图灵完备性,它 意外的是,因为它被发现 1998 年(但要利用这个 图灵完备,复杂,聪明 黑客是必要的)。

究竟是什么复杂而巧妙的技巧?

R. Rojas 的 1998 年论文摘要也指出(请注意,我没有阅读这篇论文,它只是来自 IEEE 的 sn-p。):

计算机 Z3,由 康拉德·祖泽(Konrad Zuse)在 1938 年至 1941 年间, 只能执行固定的序列 浮点算术运算 (加法,减法, 乘法、除法和平方 根)编码在穿孔带中。一个 有趣的问题,从 计算历史的观点, 是这些操作是否 足以进行通用计算。 该论文表明,事实上,一个 包含这些的单个程序循环 算术指令可以模拟 任何图灵机,其磁带是 给定有限大小。这是由 模拟条件分支和 纯间接寻址 算术手段。祖泽的Z3是 因此,至少在原则上,如 像今天的计算机一样普遍 有一个有界的寻址空间。

简而言之,SOers,图灵完备性究竟需要哪种类型的分支?假设内存是无限的,只有gotojmp 分支结构(没有ifjnz 结构)的语言可以被认为是图灵完备的吗?

【问题讨论】:

    标签: branch computer-science theory turing-complete


    【解决方案1】:

    原始的 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。

    Rojas 还写了Conditional Branching is not Necessary for Universal Computation in von Neumann Computers。在那里他提出了一种具有自修改代码和相对寻址的机器,以便您可以从内存中读取图灵指令,并修改程序以进行相应的跳转。作为替代方案,他提出了上述方法(针对 Z3),在一个仅使用 LOAD(A)、STORE(A)、INC 和 DEC 的版本中。

    【讨论】:

    • 我喜欢你的回答,但是当机器不能做算术时会发生什么?或者如果这台机器有点让人联想到 ZISC?谢谢!
    • 定义“算术”。通常的定义至少包括加法。 (第二个)Rojas 机器没有加法,只有 INC(他还讨论了不需要 DEC)。在任何情况下,我都无法证明没有条件指令的 ZISC 会或不会是图灵完备的;我个人认为不会。
    【解决方案2】:

    如果您只有算术表达式,则可以使用算术运算的某些属性。例如,is A 是 0 或 1,具体取决于某些条件(之前已计算),然后 A*B+(1-A)*C 计算表达式 if A then B else C

    【讨论】:

    • 你提出了一个有趣的解决方案。如果机器是 ZISC 或 Turing tarpit(没有算术运算)怎么办?
    【解决方案3】:

    如果您可以计算gotojmp 的地址,则可以模拟任意条件。我偶尔用它来模拟 ZX Basic 中的“ON x GOTO a,b,c”。

    如果“真”的数值为 1,“假”的值为 0,则结​​构如下:

    if A then goto B else goto C
    

    等同于:

    goto C+(B-C)*A
    

    所以,是的,通过“计算 goto”或自我修改的能力,goto 或 jmp 可以充当条件。

    【讨论】:

      【解决方案4】:

      您需要可以根据输入(结果)进行分支的东西。

      模拟条件分支的一种方法是使用自修改代码——您进行计算,将其结果存入正在执行的指令流中。您可以将无条件跳转的操作码放入指令流中,并对输入进行数学运算以根据输入的某些条件集为该跳转创建正确的目标。例如,从 y 中减去 x,如果它是正数,则右移到 0-fill,如果它是负数,则右移到 1-fill,然后添加一个基地址,并将结果存储在 jmp 操作码之后。当您到达那个 jmp 时,如果 x==y,您将转到一个地址,如果 x!=y,您将转到另一个地址。

      【讨论】:

        【解决方案5】:

        您不需要条件分支来构建图灵完备的机器,但当然任何图灵完备的机器都会提供条件分支作为核心功能。

        事实证明,像Rule 110 Cellular Automaton 这样简单的系统可以用来实现图灵机。您肯定不需要条件分支来从位桶中提取这样的系统。实际上可以使用a bunch of rocks

        关键是图灵机将提供条件分支,所以无论如何你通过证明图灵完整性所做的事情在某种程度上实现了条件分支。在某些时候,你必须在没有条件分支的情况下做到这一点,无论是岩石还是半导体中的 PN 结。

        【讨论】:

          【解决方案6】:

          从抽象的角度来看,Z3 只是图灵完备。您可以拥有任意长度的程序磁带,并让它计算每个条件分支的两侧。换句话说,对于每个分支,它都会计算两个答案并告诉你忽略哪一个。显然,这会为您可能拥有的每个条件分支创建指数级更大的程序,因此您永远无法以图灵完备的方式使用这台机器。

          【讨论】:

            【解决方案7】:

            如果一台机器可以分支,那么它被认为是图灵完备的。

            原因是条件分支自动使任何计算机图灵完备。但是,也有一些机器不能跳转分支甚至 IF 但仍然被认为是图灵完备的。

            处理只是识别输入以选择输出的过程。

            分支是理解这个过程的一种方法,跳转的条件是可以对输入进行分类,分支的位置是为该输入存储正确的输出。

            最后,澄清一下:

            如果您有条件分支,您的计算机在计算上必然等同于图灵机。但是,计算机还有很多其他方法可以实现图灵完备(lambda、IF、CL)。

            【讨论】:

              猜你喜欢
              • 2014-12-26
              • 2015-08-23
              • 2011-05-22
              • 2017-02-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-04-12
              相关资源
              最近更新 更多