Существует ли четкое определение «вычислимого» для моделей вычислений, которые не являются полностью точными?

9

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

Типичное определение вычислимости по Тьюрингу следующее:

Определение 1: Функция называется вычислимой по Тьюрингу, если существует машина Тьюринга которая вычисляет с использованием подходящего кодирования натуральных чисел в виде строк.f:NkNMf

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

Что теперь, если мы посмотрим на более слабые модели вычислений, чем машины Тьюринга? Например, давайте рассмотрим множество из «калек» машины Тьюринга с алфавитом , которая может двигаться только вправо, и определение калекой Тьюринга вычислимая которая согласуется с Тьюринга вычислимости:Mc{0,1}

Определение 2: функция называется калекой Тьюринга, вычислимой или вычислимой в M cf:NkNMc если существует искалеченная машина Тьюринга которая вычисляет f с использованием подходящей кодировки натуральных чисел как строкаMf

Если мы определим «подходящую кодировку» как «двоичного кодирования», то функция является не вычислимы в М с . Если мы аксиоматизируем «подходящее кодирование» как «унарное кодирование», то ff:NN,nn+1Mcf является вычислим в . Это кажется неловким, учитывая тот факт, что каждый может по своему усмотрению исправить одно из бесконечно многих интуитивных кодировок. Должно быть понятно, может ли вычислительная модель вычислить fMcе или нет, не ссылаясь на какую-то конкретную кодировку - по крайней мере, я никогда не видел, чтобы кто-то упоминал, какая кодировка используется, когда говорится, что «программы цикла слабее машин Тьюринга».


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

Изменить: я сократил введение, это не добавило к вопросу.

Стефан Лутц
источник

Ответы:

6

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

По сути, вычислимость является свойством строковых функций . Когда вы определяете вычислимость в любом другом домене, вы должны исправить кодировку. На практике все «разумные» кодировки эквивалентны в смысле предыдущего абзаца, поэтому точное кодирование не имеет значения.f:ΣΣ

Однако кодирование имеет значение в ограниченных моделях вычислений. В качестве крайнего примера предположим, что вы рассматриваете ограниченные по времени машины Тьюринга: скажем, вы хотите, чтобы ваша машина завершила работу за время для некоторого c , где n - длина ввода (в виде строки). Мы больше не можем переключаться между двоичным и унарным кодированием, потому что двоичное кодирование намного компактнее. Когда мы говорим о вычисляемой функции целых чисел за полиномиальное время , мы указываем, что целые числа закодированы в двоичном виде. Даже это несколько произвольный выбор, поскольку десятичное кодирование привело бы к тому же понятию вычислимости за полиномиальное время.O(nc)cn

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

Юваль Фильмус
источник
«Некий базовый факт, которого вам здесь не хватает, состоит в том, что все упомянутые вами кодировки эквивалентны с точки зрения вычислимости: есть вычислимая функция, отображающая двоичное кодирование числа в его унарное кодирование, или наоборот» - да, я Было это в оригинальной версии моего вопроса, но я не могу понять, насколько это актуально для вопроса о более слабых моделях. Также ясно, что кодирование должно быть указано как часть определения модели, но вопрос в том, как можно прийти к такому разумному определению.
Стефан Лутц
1
Один вытаскивает это определение из шляпы. Поскольку разные определения имеют тенденцию быть эквивалентными, точное определение не имеет значения. Когда это произойдет, будет несколько разных понятий сложности. Например, для некоторых графовых алгоритмов это имеет значение, если вы получаете матрицу смежности или список ребер.
Юваль Фильмус
Итак, подведем итог: а) Определение каждой отдельной вычислительной модели должно включать ее синтаксис, семантику И подходящую кодировку. б) Определение «подходящего кодирования» полностью не зависит от синтаксиса и семантики модели. c) Не существует способа дать определение «подходящего кодирования», которое действительно для всех моделей вычислений. Это верно?
Стефан Лутц
Я согласен с а) и б), но с в) только частично. Вы можете определить подходящую кодировку, которая служит «стандартной кодировкой», используемой, если явно не упомянуто об этом факте. В случае чисел такая стандартная кодировка существует - двоичная кодировка.
Юваль Фильмус
M
4

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

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

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

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

Hoopje
источник
Возможно ли, что у вас все обернулось в последнем абзаце? Вы пишете , что кодирование выполняется с помощью простой модели, а не эталонной модели - в предыдущем пункте , вы хотите иметь кодировку , проделанную эталонной моделью, а не другая модель (лямбда - исчисления).
Стефан Лутц
Если вы изучаете более слабые модели вычислений, вы не хотите нигде использовать машины Тьюринга, даже на этапе кодирования / декодирования. Тогда вы можете просто выполнить все вычисления на этапе кодирования, и любая модель вычислений будет завершена по Тьюрингу. Поэтому вам нужно использовать более простую эталонную модель для кодирования / декодирования.
Hoopje
1
nNchurch:Nlambdatermchurch(n)toBinary:lambdatermlambdatermwΣ