Написання універсальної рекурсивної функції [закрито]


9

Чи є коротка чітка побудова універсальної рекурсивної функції ? Я бачив усі визначення, які якимось чином включають нумерацію машин Тьюрінга, що можливо, але здається важким і некерованим для запису мовою програмування вищого рівня (наприклад, Python, Haskell тощо)


Питання спочатку задавали в SO , здається, тут більш підходящим.
sdcvvc

1
Я розумію, що універсальна рекурсивна функція полягає саме в тому, щоб дати деяку нумерацію рекурсивних функцій (або рівнозначно машинам Тюрінга), щоб результат міг бути обчислений з індексу рекурсивної функції та вхідних даних. Тому "універсальна рекурсивна функція без нумерації машин Тьюрінга" для мене не звучить правдоподібно.
Цуйосі Іто

3
Не рівень досліджень. Будь-який перекладач мови, що завершує Тьюрінга, є універсальною рекурсивною функцією.
Уоррен Шуді

Відповіді:



13

Звичайно. Напишіть підпрограми, які обчислюють кожну з примітивних рекурсивних функцій Годеля , і напишіть процедуру для безмежного пошукового оператора. Набір функцій, які ви можете обчислити таким чином, еквівалентний набору функцій, якими можуть обчислити машини Тьюрінга. Більше інформації тут .

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


10

Будь-який перекладач будь-якої мови, який завершує Тьюрінг, є універсальною рекурсивною функцією. Є інтерпретатори для мов високого рівня, таких як C ++ або Python.

Нумерація Годеля існує, але неявно. Наприклад, код C ++, що обчислює рекурсивну функціюг є індексом для г.


Інтерпретатор машин Тьюрінга (або Реєструвати машини, або рекурсивні функції) також є універсальною рекурсивною функцією, і їх не важко реалізувати. Я впровадив їх у C ++ кілька років тому, і я майже впевнений, що в Python це буде ще простіше. Використовуйте Google, в Інтернеті є багато безкоштовних тренажерів, а деякі з них навіть з відкритим кодом.
Каве

8

Універсальну функцію uможна легко записати мовою, схожою на Haskell (відсутність побічних ефектів, функції вищого порядку), а саме:

u f x = f x

Функція uє універсальною , так як він приймає (опис) програму fі вхідні стрічку x, і повідомляє вам результат запуску fна x.

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


Однак uбере функцію - я б назвав її функцією вищого порядку. Я хотів би uвзяти ціле число або звичайний алгебраїчний тип даних. Я не змушую жодної конкретної моделі обчислень, якщо аргумент uдотичний - наприклад, він може бути серіалізований з / у рядок.
sdcvvc

На фактичній машині (після того, як код складений) uробиться закриття, що є кінцевою послідовністю байтів. Навіть у звичайній теоремі utm ціле число, яке uприймає, являє собою функцію.
Андрій Бауер

5

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.