Я попытался найти объяснение в Google, но большинство ссылок говорят только о таких вещах, как «FRACTRAN завершается. Как пример, давайте посмотрим на умножение».
Я помню, как видел на форуме xkcd сообщение о том, что FRACTRAN помог автору понять полноту Тьюринга. Я ищу интуитивно понятное объяснение того, почему этот esolang является полным по Тьюрингу, так как не очень очевидно смотреть на механику языка.
turing-completeness
комар
источник
источник
Ответы:
Чтобы императивный язык был завершен по Тьюрингу, он должен иметь:
FRACTRAN - это язык, который состоит из ряда дробей, хранящих свои данные в показателях простых чисел.
Допустим, вы хотите добавить два числа: 2 a 3 b становится 5 ab
Это программа FRACTRAN для внесения вышеуказанных изменений.
Вы начинаете с числа, такого как 72 (2 3 3 2 ). Программа идет «вперед», пока не найдет число, которое при умножении на инструкцию является другим целым числом (без остатка).
72
побежит вперед, пока не доберется до11/2
. Затем он разделит число на2
и умножит его на11
(степень в 11 является переменной). Это дает396
.396
делится на 33 (уменьшая 3 степени и 11) и умножая на 455 (увеличивая 5, 7 и 13 переменных). И так далее. Полное описание этой программы и таблицу ее состояний можно прочитать на странице википедии FRACTRAN , включая действительно хороший анимированный GIF- файл вышеупомянутой программы.Другие материалы FRACTRAN о Stack Exchange, которые касаются полноты Тьюринга, можно найти по адресу: Конвертировать Fractran в Brainfuck (хорошо, это действительно продуктивное использование своего времени)
Часть хитрости здесь (и это начинает отклоняться от теории) заключается в том, что это закулисная машина регистрации Минского, для которой было доказано, что определенные ленты (программы) являются машинами Тьюринга, ЕСЛИ лента представлена как число Геделя, которое точно, что такое номер FRACTRAN (со связанной страницы википедии):
Итак, у нас есть условные циклы, произвольные переменные, хранящиеся в виде чисел Гёделя, у нас есть машина Тьюринга.
Некоторое другое забавное чтение, которое затрагивает Collatz как природу FRACTRAN, можно прочитать в Can't Decide? Undecide! которые связывают гипотезу Коллатца с ФРАКТРАНОМ и проблему остановки.
FRACTRAN немного сложно разобраться.
Рассмотрим программу примерно так:
При этом каждый блок имеет вид:
Первое утверждение из программы умножения выше:
Будет написано в этой форме как:
И, таким образом, вы можете ясно видеть хранилище данных и циклические конструкции, необходимые для полноты по Тьюрингу. Это очень элементарно, но он существует и работает как простой регистрационный компьютер - но это все, что вам действительно нужно сделать.
Все еще не убежден?
Это во многом заимствовано из лекции Дмитрия Хендрикса о моделях вычислений
Это берет очень простую программу,
(2/3)
которая является сумматором (2 a 3 b -> 3 a + b ), но это разрушительно - значение в 2 очищается как часть процесса.Давайте напишем более высокий уровень FRACTRAN, который позволяет легко не делать такого разрушения.
Оригинальная программа может рассматриваться как:
В F 2 можно указать «функции» своего рода.
Чтобы преобразовать программу F 2 (P) в стандартную программу FRACTRAN, необходимо:
будет выглядеть так:
Для этого используются простые числа p, q, r и s для хранения состояния программы.
И затем у нас есть машина регистра ... у нее есть конечное число регистров, которые хранят произвольные большие числа и две инструкции:
Этот регистрационный компьютер был показан завершенным по Тьюрингу.
Затем он показывает процесс на нескольких слайдах компиляции машинной программы регистрации в программу FRACTRAN как часть механического процесса.
В принципе:
И поэтому из-за эквивалентности между этими двумя моделями вычислений FRACTRAN завершен по Тьюрингу.
Кстати, если вы действительно хотите, чтобы ваш ум был взорван, прочитайте Code Golf: Fractran, в котором некоторые люди написали программу FRACTRAN для запуска другой программы FRACTRAN.
источник