FRACTRAN — повна за Тюрінгом езотерична мова програмування, яку запропонував Джон Конвей.

Опис Програма на FRACTRAN записується як упорядкований список додатних дробів разом з початковим початковим цілочисловим входом n. Програма запускається оновленням цілого числа n в такий спосіб:

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

Наприклад така програма генерує прості числаУ Книзі чисел Джон Конвей і Річард Ґай дали трохи іншу послідовність::

Починаючи з n = 2, ця програма генерує таку послідовність цілих чисел:

2, 15, 825, 725, 1925, 2275, 425, 390, 330, 290, 770, …

Після 2 ця послідовність містить такі степені 2:

які є простими степенями 2.

Розуміння програми FRACTRAN Програма FRACTRAN може розглядатися як тип машини Мінського, де регістри зберігаються в простих показниках в аргументі n.

Використовувати нумерацію Геделя, додатне ціле число n може кодувати довільне число довільно великих додатних цілочислових зміннихНумерацію Геделя не можна безпосередньо застосувати для від'ємних цілих чисел, чисел з рухомою комою або текстових рядків, хоча можна домовитись щодо непрямого подання цих типів даних. Пропоновані розширення до FRACTRAN включають FRACTRAN++ і Bag .. Значення кожної змінної кодується як показник простого числа в простій факторизації цілого числа. Наприклад, ціле число

представляє стан регістра, в якому одна змінна (яку ми будемо називати ) містить значення 2, а дві інші змінні ( і ) містять значення 1. Всі інші змінні містять значення 0.

Програма FRACTRAN — це впорядкований список додатних дробів. Кожен дріб є інструкцією, яка перевіряє одну або кілька змінних, представлених основними факторами її знаменника. Наприклад:

перевіряє дві змінні і . Якщо і , то виконуються присвоєння , , , . Наприклад:

Оскільки програма FRACTRAN є просто списком дробів, ці інструкції перевірка-присвоєння є єдиними допустимими інструкціями в мові FRACTRAN. Крім того, застосовуються такі обмеження:

Кожного разу, коли виконується інструкція, змінні, що перевіряються, також зменшуються. Одну і ту ж змінну не можна одночасно зменшити і збільшити в одній інструкції (в іншому випадку дріб, що представляє цю інструкцію, не буде нескоротним). Інструкція FRACTRAN нездатна безпосередньо перевірити, чи дорівнює змінна 0. Однак є непрямий спосіб це зробити, створивши інструкцію, яка поміщається після інших інструкцій, які перевіряють конкретну змінну.

Коментарі

Примітки

Посилання «Prime Number Pathology: Fractran»

Prime Number Pathology FRACTRAN Ruby implementation and example programs Project Euler Problem 308 «Building Fizzbuzz in Fractran from the Bottom Up» Chris Lomont, «A Universal FRACTRAN Interpreter in FRACTRAN»