有人可以用最简单的方式解释规则110吗?

时间:2013-02-09 21:29:13

标签: programming-languages turing-complete

我无法理解 the Wikipedia article the answer here 所说的内容。 有人可以用简单的术语解释规则110吗?它如何保证图灵的完整性?

4 个答案:

答案 0 :(得分:7)

我将详细说明:我不认为你正在寻找更多的证据细节,这在文章中已经相当复杂,尽管它明显省略了很多细节。

引用article you cite“在一个基本元胞自动机中,0和1的一维模式根据一组简单的规则发展。模式中的一个点是否为0或者1取决于新一代的当前值,以及它的两个邻居的值。规则110自动机具有以下规则集......“(参见后面的wikipedia table

起点,您可以将其视为数据,但可以将其视为代码的表示(将代码表示为数据,这是图灵完整性的任何证明所必需的;这可以追溯到图灵的原始结果),一个0和1的序列,通常但不一定,两侧都被仅包含0的单元包围。规则110显示了该序列如何演变。例如,如果一行中存在3 1的模式,则中间1将在下一行中“死”(变成0)。它的两个邻居发生了什么取决于模式如何超越它们。您看到的三角图是自动机从原始状态演变的图形表示,编码1为黑色,0为白色,表示从上到下的演化。初始状态的长度通常非常短,以显示非常复杂的模式可以从简单的初始状态演变出来。

图灵完整性证明的两个不同寻常的特点是,首先,这样一个非常简单的规则看起来不太可能完成你喜欢的编程语言可以做的所有事情,其次,这使得第一个事实不那么令人惊讶,是证明需要一个无限长的重复背景才能发挥其魔力。虽然我看不出任何从根本上说不诚实的事情;没有比假设一个潜在的无限或半无限的空白磁带更像是图灵最初做的那样。

要正确理解证明,您需要掌握如何在起始模式中编码数据(以及后来的代码),并且看起来对循环标记系统的熟悉程度也会有很大帮助。我不是解释这些的人。

虽然用双向细胞自动机(例如康威的"Game of Life")来理解这种情况似乎更难,但我觉得玩这个游戏很有意义,研究“滑翔机”,“滑翔机枪”和“河豚火车“和其他有趣的建筑。 (河豚火车构造滑翔机枪,滑翔机枪发射滑翔机)。这些也可以用来为这个自动机建立图灵完备性。

您可能还会发现talk page提供信息(您并不是唯一没有理解这一点的人,请参阅开头的条目“这些图片对我来说没有任何意义..” )。

答案 1 :(得分:7)

我尝试简明扼要,外行的条款解释:

  • 规则110是一个基本元胞自动机:将1和0的有限模式转换为1和0的另一种模式的规则。
  • 当在某​​些输入比特序列上迭代地应用规则110时,根据在输入比特中找到的子序列出现模式。给定足够的迭代次数,可能会发生以下情况:
    • 原始子序列显示在与原始输入相同的位置。
    • 保留原始子序列,但“移动”到位域中的其他位置。
    • 相互移动的两个子序列相互作用并相互“穿过”。
    • 两个子序列组合在一起创建一个新的子序列。
  • 不同的子序列可以赋予符号意义,如“1”,“0”,“时钟脉冲”或“生产规则”,它们对应于循环标签系统的元素。
  • 在精心构造的输入位域上对规则110进行了多次迭代,子序列的交互模拟了循环标记系统的行为。
  • 循环标签系统可用于模拟通用图灵机。因此,循环标签系统是Turing-complete。
  • 由于规则110可以模拟循环标签系统,因此它也是图灵完备的。

答案 2 :(得分:4)

1970年,约翰康威发明了Game of Life

从那时起,我认为几乎每个程序员都试图编写它的实现 - 我很久以前就已经做过了,而且很有趣。

这个游戏实际上是cellular automaton,它在无限的二维平面中的几代细胞之间设置简单的规则。例如,如果在当前生成单元中有少于2个邻居存活(位值1),则它应该在下一代孤独中死亡。如果它有超过3个邻居,它应该死于过度拥挤。如果为空(位值0或死)单元格恰好有3个邻居,则会导致它出生(变为1)。

从那以后,人们发现生命游戏非常复杂 - 它可以产生许多非常复杂的模式,并且不断发展。此外,它显示它是图灵完备的,也就是说,您可以使用起始单元格组合作为程序编码任意复杂的算法,并最终组合。但是,花了几年时间才找到如何实际生成复杂的表单,例如gliders or guns

现在回到规则110。简而言之,规则110是生命游戏的一维变体。

110只是二进制字符串01101110的十进制数字表示,它是当前生成的单元格(位)将是translated into next one的规则系统的简短形​​式,类似于Game of Life的规则系统细胞死于寂寞或过度拥挤,而且正是由三个邻居所生。

就像生命游戏一样,已经证明规则110是图灵完备的。您可以使用起始单元(位)组合作为程序对任意复杂算法进行编码,并将最终位组合作为结果。

答案 3 :(得分:2)

python中的一个实现:

(建议:实际的python程序员会为此杀了你)

import time

seed = raw_input("Feed me a string! (At least 3 characters long please)\n>")

lastline = '>'
iterator = 0

while (iterator<len(seed)):
    temp = (ord(seed[iterator]))%2
    if (temp == 1):
        lastline += '#'
    else:
        lastline += ' '
    iterator += 1

stop = 0
while (stop != 1): #Keep printing as long as CTRL-C isn't pressed
    #dummy = raw_input(lastline)
    print lastline
    iterator = 0
    nextline = '>'


    while (iterator<len(seed)):    #Convert entire string

        if (len(seed) < 3): # if wrong
            print "You had ONE JOB!"
            stop = 1

        elif (iterator == 0): # if at start
            if (lastline[1] == ' '):
                nextline += ' '
            else:
                nextline += '#'

        elif (iterator+1 == len(seed)): # if at end
            if (lastline[iterator+1] == ' '):
                nextline += ' '
            else:
                nextline += '#'

        else: #if in middle
            if (lastline[iterator] == '#' and lastline[iterator+1] == '#' and lastline[iterator+2] == '#'): #111
                nextline += ' '
            elif (lastline[iterator] == '#' and lastline[iterator+1] == '#' and lastline[iterator+2] == ' '): #110
                nextline += '#'
            elif (lastline[iterator] == '#' and lastline[iterator+1] == ' ' and lastline[iterator+2] == '#'): #101
                nextline += '#'
            elif (lastline[iterator] == '#' and lastline[iterator+1] == ' ' and lastline[iterator+2] == ' '): #100
                nextline += ' '
            elif (lastline[iterator] == ' ' and lastline[iterator+1] == '#' and lastline[iterator+2] == '#'): #011
                nextline += '#'
            elif (lastline[iterator] == ' ' and lastline[iterator+1] == '#' and lastline[iterator+2] == ' '): #010
                nextline += '#'
            elif (lastline[iterator] == ' ' and lastline[iterator+1] == ' ' and lastline[iterator+2] == '#'): #001
                nextline += '#'
            else: # (lastline[iterator-1] == ' ' and lastline[iterator] == ' ' and lastline[iterator+1] == ' '): #000
                nextline += ' '

        iterator += 1

    lastline = nextline
    time.sleep(0.02)