FRACTRAN

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

Опис[ред. | ред. код]

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

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

Наприклад така програма генерує прості числа[ком. 1]:

Починаючи з 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]. Значення кожної змінної кодується як показник простого числа в простій факторизації цілого числа. Наприклад, ціле число

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

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

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

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

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

Коментарі[ред. | ред. код]

  1. У Книзі чисел Джон Конвей і Річард Ґай дали трохи іншу послідовність:
  2. Нумерацію Геделя не можна безпосередньо застосувати для від'ємних цілих чисел, чисел з рухомою комою або текстових рядків, хоча можна домовитись щодо непрямого подання цих типів даних. Пропоновані розширення до FRACTRAN включають FRACTRAN++ і Bag.

Примітки[ред. | ред. код]

Посилання[ред. | ред. код]