我无法理解 the Wikipedia article 或 the answer here 所说的内容。 有人可以用简单的术语解释规则110吗?它如何保证图灵的完整性?
答案 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)
我尝试简明扼要,外行的条款解释:
答案 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)