Может кто-нибудь объяснить правило 110 самым простым способом?

Я не могу обернуть мою голову вокруг того, что Википедия или ответ тут сказать. Кто-нибудь может объяснить правило 110 простыми словами? Как это гарантирует полноту Тьюринга?

4 ответов


Я попробую уточнить: я не думаю, что вы ищете более подробную информацию о доказательстве, которое уже довольно сложно в статье, хотя оно явно опускает многие детали.

цитата из статья, которую вы цитируете: "в элементарном клеточном автомате одномерная модель 0 и 1 развивается в соответствии с простым набором правил. Будет ли точка в шаблоне равна 0 или 1, зависит в новом поколении от ее текущего значения, а также от его двух соседей. Автомат правила 110 имеет следующий набор правил..." (см. таблица Википедия, что следует)

отправной точкой, которую вы можете рассматривать как данные, но которая может быть принята как представление кода (представление кода как данных необходимо для любого доказательства полноты Тьюринга; это восходит к исходным результатам Тьюринга), является последовательность 0 и 1, часто, но не обязательно, окруженная с обеих сторон ячейками, содержащими просто 0. Правило 110 показывает, как развивается эта последовательность. Например, если в одной строке есть шаблон из 3 1, средний 1 "умрет" (превратится в 0) в следующей строке. То, что происходит с его двумя соседями, зависит от того, как паттерн выходит за их пределы. Треугольные диаграммы, которые вы видите, являются графическим представлением эволюции автомата из исходного состояния, кодируя 1 как черный и 0 как белый и представляя эволюцию сверху вниз. Начальное состояние часто очень короткое в длина, чтобы показать, как очень сложные шаблоны могут развиваться из простых начальных состояний.

две необычные особенности доказательства полноты Тьюринга заключаются в том, что, во-первых, маловероятно, что такое очень простое правило может сделать все, что может сделать ваш любимый язык программирования, и, во-вторых, что делает первый факт довольно менее удивительным, заключается в том, что доказательство требует бесконечно долгого повторяющегося фона, на котором работает его магия. Я не вижу ничего принципиально нечестного. об этом, однако, не более, чем предполагая потенциально бесконечную или полубесконечную пустую ленту, как это первоначально сделал Тьюринг.

чтобы правильно понять доказательство, вам нужно будет разобраться с тем, как данные (а позже и код) кодируются в начальном шаблоне, а также похоже, что знакомство с циклическими системами тегов очень поможет. Я не тот человек, чтобы это объяснять.

хотя может показаться, что сложнее понять ситуацию с 2-D клеточным автоматом, например, Конвея "Игра жизни", Я нашел поучительным играть в эту игру, изучая "планеры", "планерные пушки" и "поезда фугу" и другие забавные конструкции. (Поезд фугу строит планерные пушки, а Планерная пушка стреляет планерами). Они также могут быть использованы для установления полноты Тьюринга для этого автомата.

вы можете найти поговорите страницы информативный (вы не одиноки в том, чтобы не схватить точку, см. начало записи "в картинки не имеют для меня никакого смысла..").


моя попытка краткого, непрофессионального объяснения терминов:

  • правило 110-элементарный клеточный автомат: правило для преобразования конечного шаблона 1 и 0 в другой шаблон 1 и 0.
  • когда правило 110 итеративно применяется к некоторым входным битовым последовательностям, шаблоны появляются в зависимости от суб-последовательностей, найденных во входных битах. Учитывая достаточное количество итераций, может произойти следующее:
    • исходная под-последовательность появляется в том же в качестве исходных данных.
    • исходная подпоследовательность сохраняется, но "перемещается" в другое место в битовом поле.
    • две суб-последовательности, движущиеся навстречу друг другу, взаимодействуют и "проходят" друг через друга.
    • две подпоследовательности объединяются для создания новой подпоследовательности.
  • различным подпоследовательностям можно придать символическое значение, такое как "1", "0", "тактовый импульс" или "правило производства", которые соответствуют элементам циклического система тегов.
  • со многими итерациями правила 110 на тщательно построенном входном битовом поле взаимодействие суб-последовательностей имитирует поведение циклической системы тегов.
  • циклическую систему бирки можно использовать для того чтобы сымитировать всеобщую машину Turing. Таким образом, циклическая система тегов является полной Тьюринга.
  • поскольку правило 110 может имитировать циклическую систему тегов,оно также является полным.

В 1970 году Джон Конвей изобрел игры.

С тех пор, я думаю, почти каждый программист пытался написать его реализацию - я, конечно, сделал это давно, и это было очень весело.

эта игра на самом деле клеточный автомат, который устанавливает простые правила между поколениями клеток в бесконечной 2-мерной плоскости. Например, если в ячейке текущего поколения осталось менее 2 соседей (битное значение 1), то должен умереть в следующем поколении одиночества. Если у него более 3 соседей, он должен умереть от переполненности. Если пусто (битовое значение 0, или мертвая) клетка имеет ровно 3 соседей, это заставит ее родиться (стать 1).

планеры или пушки.

Теперь вернемся к правилу 110. Проще говоря, правило 110-это одномерная вариация игры жизни.

110 - это просто десятичное представление двоичной строки 01101110 который является короткой формой системы правил того, как текущая генерация ячеек (битов) будет переведено на следующий, подобно системе правил игры жизни клеток, умирающих от одиночества или переполненности и рождающихся от наличия ровно трех соседей.

как и Игра жизни, было доказано, что правило 110 является Тьюринг-полным. Вы можете кодировать произвольно сложный алгоритм, используя комбинацию начальных ячеек (битов) в качестве вашей программы и конечную комбинацию битов в результате.


реализация в 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)