Щоб імперативна мова була Тюрінг повною, вона повинна мати:
- Умовна петля
- Довільна кількість змінних
FRACTRAN - мова, що складається з серії дробів, які зберігають свої дані в експонентах прайметів.
Скажімо, ви хочете додати два числа: 2 a 3 b стає 5 ab
455 11 1 3 11 1
---, -, -, -, -, -
33 13 11 7 2 3
Це програма FRACTRAN для виконання зазначених змін.
Ви починаєте з числа типу 72 (2 3 3 2 ). Програма йде "вперед" до тих пір, поки не знайде число, яке при множенні на інструкцію є іншим цілим числом (залишки не дозволені).
72
буде бігти вперед, поки не потрапить 11/2
. Потім воно поділить число на 2
і помножить на 11
(потужність у 11 - це змінна). Це дає 396
. 396
ділиться на 33 (зменшуючи 3 потужність і 11) і помножуючи на 455 (збільшуючи 5, 7 і 13 змінних). І так далі. Повний опис цієї програми та її таблиця стану можна прочитати на сторінці вікіпедії FRACTRAN , включаючи дійсно приємний анімований gif цієї програми.
Інші матеріали FRACTRAN про стек-біржі, що стосуються повноти Тьюрінга, можна знайти за адресою: Перетворити Fractran в Brainfuck (гаразд, це справді продуктивне використання свого часу)
Причиною того, що Fractran є Тюрінг-повним, є те, що він імітує реєстрову машину. Основна факторизація числа зберігає вміст регістрів, тоді як ділення та множення є способом умовного додавання та віднімання з регістрів.
Частина хитрості тут (і це починає відштовхуватися від теорії) полягає в тому, що за лаштунками це машина реєстру Мінського, для якої було доведено, що певні стрічки (програми) є машинами Тьюрінга, якщо стрічка представлена як номер Геделя, який є що саме означає номер FRACTRAN (зі зв’язаної сторінки з вікіпедії):
Гедель використовував систему, засновану на основній факторизації. Він вперше присвоїв унікальний природний номер кожному базовому символу на формальній мові арифметики, з якою мав справу.
Отже, у нас є умовні петлі, довільні змінні, що зберігаються як номери Геделя, у нас є машина Тьюрінга.
Деякі інші цікаві читання, які стосуються природи Колалц, як природа FRACTRAN, можна прочитати у програмі Can't Decide ? Невиріши! які пов'язують гіпотезу Колатца з FRACTRAN та проблему зупинки.
FRACTRAN трохи важко обійти голову.
Розглянемо програму приблизно як:
LABEL: start
block1
block2
block3
...
END
У цьому кожен блок має форму:
IF(registers X >= a, Y >= b) # or any combination of registers
THEN
X -= a
Y -= b
I += n
J += m
goto start
Перше твердження з програми множення вище:
455
---
33
У цій формі буде написано як:
IF(register `3` >= 1 && `11` >= 1)
THEN
`3` -= 1
`11` -= 1
`5` += 1
`7` += 1
`13` += 1
goto start
Таким чином, ви можете чітко бачити сховища даних і циклічні конструкції, необхідні для повноти Тьюрінга. Це дуже рудиментарно, але він існує і працює як проста машина реєстру - але тоді все, що вам потрібно насправді зробити.
Ще не переконаний?
Це багато в чому запозичується з лекції Димитрія Хендрікса про моделі обчислень
Для цього (2/3)
потрібна дуже проста програма, яка є суматором (2 a 3 b -> 3 a + b ), але вона руйнівна - значення в 2 очищається як частина процесу.
Дозволяє написати FRACTRAN вищого рівня, що дозволяє легко не робити таких руйнувань.
Оригінальну програму можна розглядати як:
2
α: - → α
3
У F 2 можна вказати "функції" свого роду.
10 1
α: - → α, - → β
3 1
3
β: - → β
5
Для перетворення програми F 2 (P) у стандартну програму FRACTRAN необхідно зробити:
- Очистіть П петель довжиною 1
- Замініть грецькі букви (функції) свіжими простими цифрами
- Замініть переходи:
туз
p: - → q, - → r, - -> s, ...
bdf
стає:
aq cr es
-, -, -, ...
bp dp fp
Для цього використовується праймес p, q, r і s для зберігання стану програми.
І тоді у нас з'явилася машина реєстру ... вона має обмежену кількість регістрів, які зберігають довільну велику кількість і дві інструкції:
- inc (x i , m) - приріст регістру i та перехід до рядка m
- jzdec (x i , m 1 , m 2 ) - якщо регістр i дорівнює 0, перейдіть до рядка m, інакше decrement i, і перейдіть до рядка m2.
Показано, що ця реєстраційна машина завершена Тьюрінгом.
Потім він показує процес на декількох слайдах складання програми реєстру машин в програму FRACTRAN як частина механічного процесу.
В основному:
p (i)
inc (x (i), m) = ---- → m
1
1 1
jzdec (x (i), m1, m2) = ---- → m2, - → m1
p (i) 1
Отже, через рівноцінність між цими двома моделями обчислень, FRACTRAN є Тьюрінгом завершеним.
До речі, якщо ви дійсно хочете, щоб ваш розум був роздутий, прочитайте Code Golf: Fractran, в якому деякі люди написали програму FRACTRAN, щоб запустити ще одну програму FRACTRAN.