FRACTRAN —
полный по Тьюрингу эзотерический язык программирования, предложенный Джоном Конвеем.
Описание
Программа на FRACTRAN записывается как упорядоченный список положительных дробей вместе с начальным положительным целочисленным входом n.
Программа запускается путём обновления целого числа n следующим образом:
- для первой дроби в списке, для которой произведение является целым числом, замените на
- повторяйте это правило до тех пор, пока ни одна дробь в списке не выдаст целое число при умножении на , затем остановите.
Например следующая программа генерирует простые числа:
Начиная с n = 2, эта программа генерирует следующую последовательность целых чисел:
- 2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, ... последовательность A007542 в OEIS
После 2 эта последовательность содержит следующие степени 2:
- последовательность A034785 в OEIS
которые являются простыми степенями 2.
Понимание программы FRACTRAN
Программа FRACTRAN может рассматриваться как тип машины Минского, где регистры хранятся в простых показателях в аргументе n.
Используя нумерацию Гёделя, положительное целое число n может кодировать произвольное число произвольно больших положительных целочисленных переменных.
Значение каждой переменной кодируется как показатель простого числа в простой факторизации целого числа.
Например, целое число
представляет состояние регистра, в котором одна переменная (которую мы будем называть ) содержит значение 2, а две другие переменные ( и ) содержат значение 1.
Все остальные переменные содержат значение 0.
Программа FRACTRAN — это упорядоченный список положительных дробей.
Каждая дробь представляет собой инструкцию, которая проверяет одну или несколько переменных, представленных основными факторами её знаменателя.
Например:
проверяет две переменные и .
Если и , то выполняются присвоения , , , .
Например:
Поскольку программа FRACTRAN представляет собой просто список дробей, эти инструкции проверка-присвоение являются единственными допустимыми инструкциями на языке FRACTRAN.
Кроме того, применяются следующие ограничения:
- Каждый раз, когда выполняется инструкция, проверяемые переменные также уменьшаются.
- Одна и та же переменная не может быть одновременно уменьшена и увеличена в одной инструкции (в противном случае дробь, представляющая эту инструкцию, не будет несократимой).
- Инструкция FRACTRAN неспособна непосредственно проверить, равна ли переменная 0. Однако есть непрямой способ это сделать путём создания инструкции, которая помещается после других инструкций, которые проверяют конкретную переменную.
Ссылки
|