1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7

# теория · шаг 2 из 7

Варианты машины и тезис Чёрча-Тьюринга: почему модель одна

Коротко

Машину Тьюринга можно улучшать: дать несколько лент, ленту без левого края, память с доступом по адресу, разрешить угадывать. Ни одно улучшение не добавляет ни одной новой решаемой задачи: каждый вариант моделируется исходной машиной. Меняется только время: несколько лент дают выигрыш не больше квадрата, память с адресами (пока длина чисел в ячейках растёт не быстрее многочлена от размера входа) - не больше многочлена, угадывание - не больше экспоненты. Так же ведут себя все остальные определения вычислимости, придуманные независимо. Отсюда тезис Чёрча-Тьюринга: всё, что можно вычислить по какой-либо чёткой процедуре, можно вычислить на машине Тьюринга. Это не теорема, а утверждение о мире, которое девяносто лет не удаётся опровергнуть.

Если ты объяснишь, что значит «одна модель моделирует другую», назовёшь цену перехода от нескольких лент к одной и от угадывания к перебору и скажешь, почему тезис Чёрча-Тьюринга нельзя доказать, - листай до «Теперь сам».

Как думаешь, сильнее ли машина с двумя лентами

Одна лента - очевидное неудобство: чтобы сравнить два куска входа, головка бегает туда и обратно. Дадим машине вторую ленту со своей головкой: на одну можно переписать кусок, по другой идти и сверять.

Ответь себе до чтения: появятся ли языки, которые двухленточная машина принимает, а одноленточная - нет? Не появятся. Одноленточная машина может записать содержимое обеих лент на свою единственную, пометить, где стоят головки, и выполнять шаги двухленточной по одному, каждый раз проходя по всей записи. Это медленнее, но ответ тот же. С автоматами было иначе: стек добавил языков. Здесь добавлять уже нечего.

На что это похоже

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

Языки отличаются удобством и скоростью, а не тем, что на них возможно. Модели вычислений - тоже.

Механизм: моделирование и что оно стоит

Сравнивают модели так. Модель A моделирует модель B, если для каждой машины из B можно построить машину из A, которая на каждом входе даёт тот же исход: принимает, отвергает или не останавливается. Если моделирование есть в обе стороны, модели равносильны: языки у них одни и те же.

Варианты машины Тьюринга и цена их перевода в исходную модель:

вариант                  как моделируется одной лентой    цена по времени
лента, бесконечная       сложить пополам:                 того же порядка
в обе стороны            в клетке пара символов
k лент со своими         все ленты подряд,                t шагов →
головками                головки помечены                 порядка t²
память с доступом        адреса и содержимое              многочлен от t
по адресу                записаны на ленте
недетерминированная      перебор всех вариантов           t шагов →
машина                   шага в ширину                    порядка bᵗ

Здесь t - число шагов исходной машины, b - наибольшее число вариантов одного шага. Считаем, что t не меньше длины входа: машине с адресами дальняя клетка входа доступна за шаг, а ленточной до неё надо дойти.

Что стоит за строками таблицы. Ленту без левого края складывают по клетке 0: в клетке i новой ленты лежат два символа, из клеток i и −i старой, а состояние помнит, по какой половине идёт головка; на левой половине направления меняются местами. У машины с k лентами один шаг читает по символу с каждой ленты и для каждой говорит, что записать и куда сдвинуть головку. Память с доступом по адресу - это пронумерованные ячейки с числами, как список в Python; одна лента хранит пары «адрес, содержимое» и ищет нужную ячейку просмотром. Многочлен в этой строке получается, пока числа в ячейках не слишком длинны: длина их записи растёт не быстрее многочлена от размера входа.

Недетерминированная машина определена как раньше: в таблице на пару «состояние, символ» может быть несколько строк; машина принимает вход, если хотя бы одна последовательность выборов ведёт в принимающее состояние; отвергает, если все последовательности останавливаются и ни одна не принимает; иначе не останавливается. Детерминированная машина моделирует её, обходя дерево конфигураций в ширину: уровень i - все конфигурации, достижимые за i шагов. Обход в глубину не годится: он может уйти в ветку, которая не останавливается, и не дойти до принимающей. Угадывание, как и у конечных автоматов, не добавляет языков. Но у автоматов оно стоило экспоненты в числе состояний, а здесь - экспоненты во времени, и можно ли обойтись многочленом, неизвестно: это вопрос о P и NPРазбирается в разделе 21, глава «P, NP, сведения и NP-полнота»: Класс NP: решение легко проверить, даже когда трудно найти из пятой главы.

Другие определения. В 1930-е годы вычислимость определяли несколько человек, независимо и совсем по-разному: Чёрч - через подстановку в выражения с функциями, Гёдель и Клини - через функции на числах, построенные рекурсией, Пост и Тьюринг - через машины. Все определения оказались равносильны: каждое моделирует каждое. Позже добавились машины с регистрами, клеточные автоматы, языки программирования - с тем же результатом.

Тезис Чёрча-Тьюринга: всякая функция, которую можно вычислить по чёткой конечной процедуре, вычислима на машине Тьюринга. Машина вычисляет функцию так: вход записан на ленте, ответ - то, что осталось на ленте после остановки. Слева в этом утверждении стоит неформальное понятие «чёткая процедура», справа - формальное, поэтому доказать тезис нельзя: доказательству не на что опереться слева. Можно было бы опровергнуть - предъявив процедуру, которую машина не моделирует. За девяносто лет этого не случилось.

Правило

Многоленточные, недетерминированные машины и машины с адресуемой памятью принимают те же языки, что и одноленточная машина Тьюринга. Переход к одной ленте стоит не больше квадрата времени для нескольких лент, не больше многочлена для памяти с адресами и не больше экспоненты для недетерминизма. Тезис Чёрча-Тьюринга: класс вычислимого не зависит от модели и совпадает с тем, что вычисляет машина Тьюринга; это утверждение не доказывается, а подтверждается.

Разбор: лента из двух стеков

Один стек давал КС-языки. Дадим автомату второй - и получим машину Тьюринга. Левый стек хранит всё, что левее головки, правый - символ под головкой и всё, что правее; вершины обоих стеков смотрят на головку. Сдвиг головки вправо - переложить символ с правого стека на левый, сдвиг влево - наоборот.

Функция na_stekah выполняет ту же таблицу для aⁿbⁿcⁿ, что и в прошлом уроке, не имея ленты вовсе.

def na_stekah(tabl, vhod, predel):
    levyj = []
    pravyj = []
    for i in range(len(vhod) - 1, -1, -1):
        pravyj.append(vhod[i])
    sostoyanie = "0"
    shagov = 0
    while sostoyanie != "да":
        if len(pravyj) == 0:
            pravyj.append("_")
        klyuch = sostoyanie + pravyj[-1]
        if klyuch not in tabl:
            return ["нет", shagov]
        if shagov == predel:
            return ["не остановилась", shagov]
        hod = tabl[klyuch]
        pravyj.pop()
        if hod[1] == "R":
            levyj.append(hod[0])
        else:
            pravyj.append(hod[0])
            if len(levyj) > 0:
                pravyj.append(levyj.pop())
        sostoyanie = hod[2]
        shagov = shagov + 1
    return ["да", shagov]

t = {}
t["0a"] = ["X", "R", "1"]
t["0Y"] = ["Y", "R", "4"]
t["0_"] = ["_", "R", "да"]
t["1a"] = ["a", "R", "1"]
t["1Y"] = ["Y", "R", "1"]
t["1b"] = ["Y", "R", "2"]
t["2b"] = ["b", "R", "2"]
t["2Z"] = ["Z", "R", "2"]
t["2c"] = ["Z", "L", "3"]
for simvol in "abYZ":
    t["3" + simvol] = [simvol, "L", "3"]
t["3X"] = ["X", "R", "0"]
t["4Y"] = ["Y", "R", "4"]
t["4Z"] = ["Z", "R", "4"]
t["4_"] = ["_", "R", "да"]
for vhod in ["abc", "aabbcc", "aabbc", "abcc"]:
    print(vhod, na_stekah(t, vhod, 100000))
for n in [2, 4, 8, 16, 32]:
    print(n, na_stekah(t, "a" * n + "b" * n + "c" * n, 100000))
abc ['да', 8]
aabbcc ['да', 23]
aabbc ['нет', 13]
abcc ['нет', 7]
2 ['да', 23]
4 ['да', 77]
8 ['да', 281]
16 ['да', 1073]
32 ['да', 4193]

Исходы и число шагов совпали с прошлым уроком до единицы: 8, 23, 13 и 7 на коротких входах; 23, 77, 281, 1073 и 4193 на длинных. Моделирование здесь точное, шаг в шаг.

Вывод о лестнице моделей: один стек - контекстно-свободные языки, два стека - уже всё вычислимое, и третий ничего не добавит. Граница между «ограниченной моделью» и «полной» проходит между одним стеком и двумя. Поэтому полными так легко оказываются системы, которые никто не проектировал как языки программирования: достаточно двух стеков или двух счётчиков - с прибавлением, вычитанием и проверкой на ноль - и условного перехода. Про счётчики это известный факт, здесь он без доказательства; идея в том, что содержимое стека можно записать одним числом.

Разбор: что стоит перевод между моделями

Возьмём машину с двумя лентами, которая делает t шагов. Одноленточная машина хранит обе ленты подряд через разделитель и помечает клетки, где стоят головки:

лента 1:   a  b [a] b            одна лента:    a  b  a° b  #  X  Y° _
лента 2:   X [Y] _               кружок - «здесь стоит головка»

Один шаг двухленточной машины превращается в проход: дойти до обеих пометок, прочитать символы под ними, вернуться и исправить запись. Если первой ленте нужна новая клетка, хвост записи сдвигают на клетку вправо - это ещё один проход того же порядка. За t шагов головки уходят не дальше чем на t клеток; если вход не длиннее t, вся запись занимает порядка t клеток, поэтому проход стоит порядка t шагов, а всё моделирование - порядка t · t = t². Тысяча шагов на двух лентах - не больше порядка миллиона на одной.

С недетерминизмом иначе. Пусть на каждом шаге у машины не больше двух вариантов и она работает t шагов. Дерево её вычислений имеет до 2ᵗ листьев, и обход в ширину просматривает их все:

шагов t                      10        20         50          100
конфигураций на уровне t     1024      10⁶        10¹⁵        10³⁰

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

Отсюда два вывода разной силы. Что вычислимо - не зависит от модели: для всех перечисленных моделей это доказано, а для любой будущей это утверждает тезис. За сколько вычислимо - зависит, но для всех разумных детерминированных моделей - тех, где один шаг делает ограниченный объём работы, - в пределах многочлена: квадрат, куб, но не экспонента. Поэтому классы задач в теории сложности определяют «с точностью до многочлена» - такие определения не зависят от того, считаем мы шаги машины Тьюринга или строки программы.

Что ломается без этого

«Тезис доказан». Он не может быть доказан: одна из его сторон - неформальное понятие. Доказаны теоремы о равносильности конкретных моделей, и их много; тезис - обобщение этих теорем.

«Квантовый компьютер вычисляет то, что обычному недоступно». По части того, что вычислимо, - нет: квантовую машину можно смоделировать обычной, с экспоненциальным замедлением. Вопрос только в скорости, и он разобран в последней главе разделаРазбирается в разделе 21, глава «Квантовая модель - кубит, интерференция, алгоритм Шора»: Алгоритм Шора и границы: что квантовый компьютер ускоряет, а что нет.

«Раз модели равны, скорость не важна». Равны классы вычислимого. Квадратичное замедление на практике отличает работающую программу от неработающей; теория пренебрегает им сознательно, чтобы её выводы не зависели от модели.

Недетерминированную машину принимают за устройство. Это способ определить язык: «существует удачная последовательность выборов». Устройства с такой способностью нет; моделировать её умеют перебором, а можно ли обойтись без него - открытый вопрос.

Зачем это в работе

Право писать программы вместо таблиц. С этого места в курсе «алгоритм» - это программа на Python или описание словами, а не таблица переходов: по тезису всё, что так записано, переводится в машину Тьюринга, и теоремы о машинах относятся к программам.

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

Устойчивые определения. «Задача решается за полиномиальное время» означает одно и то же для машины Тьюринга, для процессора и для программы на любом языке. Без этой устойчивости результаты о сложности пришлось бы доказывать для каждой архитектуры заново.

Теперь сам

  1. Машина с тремя лентами делает 500 шагов. Оцени сверху порядок числа шагов одноленточной машины, которая её моделирует.
  2. Недетерминированная машина делает 40 шагов, на каждом у неё до двух вариантов. Сколько конфигураций может оказаться на последнем уровне дерева?
  3. Как в модели из двух стеков сдвинуть головку влево?
  4. Почему тезис Чёрча-Тьюринга нельзя доказать, но можно было бы опровергнуть?
  5. Кто-то предлагает модель «машина Тьюринга с двумерной лентой». Что нужно сделать, чтобы показать, что она не сильнее обычной?

Ответ. 1. Порядка 500² = 250 000.

  1. До 2⁴⁰, около триллиона.

  2. Записанный символ положить на правый стек, затем, если левый стек не пуст, снять его вершину и тоже положить на правый: она окажется под головкой. При пустом левом стеке головка стоит у края и остаётся на месте.

  3. В нём сравнивается неформальное понятие с формальным; доказательство требует формальных обеих сторон. Опровержением была бы конкретная процедура, которую все признают чёткой и которую машина не моделирует.

  4. Построить моделирование: описать, как записать занятую часть двумерной ленты на одномерную и как одним шагом обычной машины - или конечной серией шагов - выполнить шаг двумерной.

Главное

У вычислимости нет версий: сколько ни добавляй машине удобств, решаемых задач не прибавляется, и все независимо придуманные определения совпали. Поэтому слово «алгоритм» можно понимать как «программа», не уточняя язык. Различаются модели только ценой, и главная неизвестная цена - сколько на самом деле стоит избавиться от угадывания.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.