Що робить PROLOG Turing повним?


15

Я знаю, що це можна довести, що PROLOG є Тюрінг-завершеним, створивши програму, яка імітує машину Тьюрінга на зразок цього:

turing(Tape0, Tape) :-
    perform(q0, [], Ls, Tape0, Rs),
    reverse(Ls, Ls1),
    append(Ls1, Rs, Tape).

perform(qf, Ls, Ls, Rs, Rs) :- !.
perform(Q0, Ls0, Ls, Rs0, Rs) :-
    symbol(Rs0, Sym, RsRest),
    once(rule(Q0, Sym, Q1, NewSym, Action)),
    action(Action, Ls0, Ls1, [NewSym|RsRest], Rs1),
    perform(Q1, Ls1, Ls, Rs1, Rs).

symbol([], b, []).
symbol([Sym|Rs], Sym, Rs).

action(left, Ls0, Ls, Rs0, Rs) :- left(Ls0, Ls, Rs0, Rs).
action(stay, Ls, Ls, Rs, Rs).
action(right, Ls0, [Sym|Ls0], [Sym|Rs], Rs).

left([], [], Rs0, [b|Rs0]).
left([L|Ls], Ls, Rs, [L|Rs]).

Джерело

Однак мені цікаво, які частини мови PROLOG можна позбутися (особливо символи функцій, перевантаження клаузулами, рекурсія, об'єднання), не втрачаючи повноти Тюрінга. Чи завершені самі символи функцій Тьюрінга?


4
Вам потрібні лише функції пролога, які використовуються у вашому фрагменті коду.
Yuval Filmus

1
Ви бачили це питання ?
Рафаель

2
@YuvalFilmus: Можливо, в PROLOG існують інші способи програмування машини Тьюрінга.
Ленар Хойт

Відповіді:


18

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

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

Якщо ви позбавили символів функції, ви не можете створити відповіді або проміжні продукти без обмежень; ви можете використовувати лише атоми, які відображаються в програмі та запиті. В результаті набір усіх можливих рішень будь-якого запиту є кінцевим , тому прийняття найменш фіксованої точки програми / запиту завжди припиняється. За цим принципом працює Datalog (мова запитів реляційних баз даних на основі Prolog).

Так само, якщо ви обмежили Prolog лише примітивною рекурсією (яка не включає рекурсію як вироджений випадок), то кількість рекурсії, яку ви можете зробити, обмежена розміром запиту, тому всі обчислення припиняються. Тож вам потрібна загальна рекурсія для Тюрінга-повноти.

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



Дуже хороший момент. Я не думав про кількісну оцінку, але це справді інший підхід.
Псевдонім

0

Виконання чудової відповіді на @Pseudonym та посилання на ваше останнє запитання "Чи самі символи функцій Turing завершені?".

Ви, мабуть, маєте на увазі: Чи може мова, створена лише з функціональних символів, бути Тьюрінг-завершеною?

Відповідь - так - подумайте про функціональні мови програмування, такі як ML та Haskell.

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