代码之家  ›  专栏  ›  技术社区  ›  David Titarenco

条件分支是图灵完备性的要求吗?

  •  9
  • David Titarenco  · 技术社区  · 15 年前

    我在网上搜索,发现了一些矛盾的答案。一些资料断言,一种语言/机器/你拥有的东西是图灵完备的,如果并且只有当它拥有 有条件和无条件分支(我猜这是多余的),有人说只需要无条件,有人说只需要有条件。

    阅读德语 Z3 和 ENIAC ,维基百科说:

    1941年)由康拉德·祖斯设计。它 是第一个通用数字 电脑,但它是 机电的,而不是 功能。它使用逻辑计算 穿孔磁带,但缺少 有条件的分支。而不是设计的 对于图灵完备性,它 不小心被发现了 在1998年(但是为了利用这个 图灵完整性,复杂,聪明 黑客是必要的)。

    罗哈斯1998年的一篇论文摘要也指出(注意,我没有读过这篇论文,它只是IEEE的一个片段):

    从1938年到1941年, 只能执行固定序列 (加减法, 根)在穿孔磁带中编码。一个 从计算史的角度来看, 足以进行通用计算。 论文表明,事实上 包含以下内容的单个程序循环 算术指令可以模拟 任何磁带为 模拟条件分支和 纯间接寻址 算术方法。Zuse的Z3是 就像今天的计算机

    简而言之,soer,图灵完备性到底需要什么类型的分支?假设有无限的内存,一种语言能不能 goto 或 jmp if 或 jnz 构造)是否认为图灵是完整的?

    7 回复  |  直到 15 年前
        1
  •  10
  •   Martin v. Löwis    15 年前

    可以找到原始的罗哈斯纸 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

        2
  •  4
  •   dmitry_vk    15 年前

    如果只有算术表达式,则可以使用算术运算的某些属性。E、 g.,是 A 是0还是1取决于某些条件(之前计算过),然后 A*B+(1-A)*C 计算表达式 if A then B else C

        3
  •  3
  •   Jerry Coffin    15 年前

    你需要一些基于输入(结果)的分支。

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

        4
  •  2
  •   Vatine    15 年前

    如果你能计算出 goto 或 jmp

    如果“true”的数值为1,而“false”为0,则结构如下:

    if A then goto B else goto C
    

    相同于:

    goto C+(B-C)*A
    

    所以,是的,有了“计算的goto”或自我修改的能力,goto或jmp就可以充当一个条件。

        5
  •  1
  •   Gabe Timothy Khouri    15 年前

        6
  •  1
  •   thodg    15 年前

    您不需要条件分支来构建图灵完备机,但是任何图灵完备机都会提供条件分支作为核心特性。

    事实证明,像 Rule 110 Cellular Automaton a bunch of rocks .

    关键是图灵机器将提供条件分支,所以通过证明图灵完备性所做的工作在某种程度上实现了条件分支。无论是在半导体中的岩石或PN结,你都必须在某个点上不带条件分支。

        7
  •  1
  •   Achraf Almouloudi Luan Almeida    7 年前

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

    原因是有条件分支会自动使任何计算机图灵完成。然而,也有一些机器不能跳转分支,即使这样,仍然被认为是图灵完备的。

    分支是使这个过程智能化的一种方法,跳转的条件是什么可以对输入进行分类,分支的位置是存储该输入的正确输出的位置。

    最后,澄清一下:

    如果你有条件分支,你的计算机在计算上必然等同于图灵机器。然而,对于一台计算机来说,有很多其他的方法来实现图灵完备性(lambda,IF's,CL)。