Чому завершення FRACTRAN завершено?


10

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

Я пам'ятаю, як бачив на форумі xkcd форум, що FRACTRAN допоміг плакату зрозуміти повноту Тьюрінга. Я шукаю інтуїтивне пояснення, чому цей езоланг є Тюрінгом повним, оскільки це не дуже очевидно, дивлячись на мовну механіку.


Для незнайомих з FRACTRAN: en.wikipedia.org/wiki/FRACTRAN
FrustratedWithFormsDesigner

2
Причина множення є хорошим прикладом твердження повноти, тому що вона потребує циклічного і зберігання. Хоча це не повний тест на те, чи є щось завершеним. Найкращий "доказ" - написати в ній емулятор мозкових емуляторів
Earlz

Відповіді:


12

Щоб імперативна мова була Тюрінг повною, вона повинна мати:

  1. Умовна петля
  2. Довільна кількість змінних

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. Очистіть П петель довжиною 1
  2. Замініть грецькі букви (функції) свіжими простими цифрами
  3. Замініть переходи:
   туз
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.


2
І я думав, що Brainf * ck дивно.
Роберт Харві

Зауважте, що Системи векторних доповнень пов'язані, оскільки будь-яка програма Fractran може бути записана як VAS. А також сітки Петрі.
Дан Д.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.