【问题标题】:Can someone explain Rule 110 in the simplest way possible?有人能以最简单的方式解释第 110 条规则吗?
【发布时间】:2013-01-25 08:30:24
【问题描述】:

我无法理解 the Wikipedia articlethe answer here 所说的话。 有人可以简单地解释第 110 条规则吗?它如何保证图灵完备?

【问题讨论】:

  • 您是否只是在问编码规则 110 是如何表明它是图灵完备的(如果您愿意接受规则 110 本身就是图灵完备的,这很容易)?或者您对规则 110 是图灵完备的证明感兴趣吗?
  • 这是一个很好的问题,我很想听听答案,但我认为它更适合 cs.stackexchange.com。
  • @delnan 我试图以通俗的方式解释规则 110。考虑到以前有过关于它的问题,我不认为这个问题是题外话。
  • 是的,你的问题很有趣。请问:您了解第 110 条的实际作用吗?维基百科的文章解释了这一点,承认非常简短。

标签: programming-languages turing-complete


【解决方案1】:

我尝试用简洁的外行术语解释:

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

【讨论】:

    【解决方案2】:

    我将尝试详细说明:我认为您不会在文章中寻找已经相当复杂的证明的更多细节,尽管它显然省略了许多细节。

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

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

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

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

    虽然使用 2-D 元胞自动机(例如 Conway 的 "Game of Life")似乎更难理解情况,但我发现玩这个游戏很有启发性,研究“滑翔机”、“滑翔机枪”和“河豚火车” "和其他有趣的结构。 (河豚列车制造滑翔机枪,滑翔机枪发射滑翔机)。这些也可以用来建立这个自动机的图灵完备性。

    您还可能会发现talk page 信息丰富(您不是唯一一个没有抓住重点,请参阅开头的条目“这些图片对我没有任何意义..”)。

    【讨论】:

    • 有一个很好的 page at Wolfram Mathworld 澄清规则 110。
    • 您也可以使用Golly 来试验一维和二维元胞自动机。提供的示例之一是使用 Life 2-D 自动机的图灵机模拟。
    • 不错的答案。我现在了解规则的实际含义,但仍然无法与此处的 CSS3 jsfiddle 相关联。这如何体现第 110 条规则?
    • 您可以单击复选框数组(例如,在第一行),它会在下一行以橙色显示您单击的单元格的命运。单击橙色单元格,它会在下一行显示其命运。一旦点击了一行中的所有橙色单元格,根据规则 110,这就是该行的真实状态,基于前一行。我不知道这究竟应该如何显示 CSS3 的图灵完整性,但大概这种手动计算过程也可以在 CSS3 中自动化。我也不知道如何在必要时自动扩展复选框数组。
    • 哦,确实有道理。然而,自动化无法在 CSS 中完成,这意味着它实际上还没有完成?
    【解决方案3】:

    1970 年,John Conway 发明了Game of Life

    从那以后,我认为几乎每个程序员都尝试编写它的实现——我当然很久以前就这样做了,而且很有趣。

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

    从那时起,人们发现生命游戏异常复杂——它可以产生许多非常复杂的模式,并不断发展。此外,它被证明是图灵完备的,也就是说,您可以使用起始单元组合作为程序来编码任意复杂的算法,并作为结果进行最终组合。然而,花了几年的时间才找到如何真正生成复杂的表单,比如gliders or guns

    现在回到规则 110 是什么。简单地说,规则 110 是生命游戏的一维变体。

    110 只是二进制字符串01101110 的十进制数字表示,它是当前一代细胞(位)将如何translated into next one 的规则系统的缩写形式,类似于生命游戏中细胞死于孤独的规则系统或者人满为患,生来就只有三个邻居。

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

    【讨论】:

      【解决方案4】:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-02
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 2015-04-09
        • 2020-01-17
        • 1970-01-01
        相关资源
        最近更新 更多