Was macht PROLOG Turing-complete aus?


15

Ich weiß, dass es bewiesen werden kann, dass PROLOG Turing-vollständig ist, indem ein Programm erstellt wird, das eine Turing-Maschine wie diese simuliert:

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]).

Quelle

Ich frage mich jedoch, welche Teile der PROLOG-Sprache entfernt werden könnten (insbesondere Funktionssymbole, Überladung von Klauseln, Rekursion, Vereinheitlichung), ohne die Vollständigkeit von Turing zu verlieren. Sind die Funktionssymbole selbst vollständig?


4
Sie benötigen nur die Funktionen von Prolog, die in Ihrem Code-Snippet verwendet werden.
Yuval Filmus


2
@YuvalFilmus: Vielleicht gibt es andere Möglichkeiten, eine Turing-Maschine in PROLOG zu programmieren.
Lenar Hoyt

Antworten:


18

Es ist eine ziemlich verlässliche Faustregel, dass die Turing-Vollständigkeit von der Fähigkeit abhängt, Antworten oder Zwischenwerte von uneingeschränkter "Größe" zu konstruieren und eine uneingeschränkte Anzahl von Schleifen oder Wiederholungen durchzuführen. Wenn Sie diese beiden Dinge haben, haben Sie wahrscheinlich Turing-Vollständigkeit. (Genauer gesagt, wenn Sie Peano-Arithmetik konstruieren können, dann haben Sie mit Sicherheit Turing-Vollständigkeit!)

Nehmen wir für den Moment an, dass Sie die Arithmetik bereits entfernt haben. Wir gehen auch davon aus, dass Sie keine nicht-logischen Funktionen wie atom_chars, assertusw. haben, die allgemeine Spielereien ermöglichen.

Wenn Sie Funktionssymbole entfernt haben, können Sie keine Antworten oder Zwischenstufen mit uneingeschränkter Größe erstellen. Sie können nur Atome verwenden, die im Programm und in der Abfrage enthalten sind. Infolgedessen ist die Menge aller möglichen Lösungen für jede Abfrage endlich , so dass die Verwendung des am wenigsten festgelegten Punkts des Programms / der Abfrage immer beendet wird. Datalog (eine auf Prolog basierende relationale Datenbankabfragesprache) arbeitet nach diesem Prinzip.

Wenn Sie Prolog nur auf die primitive Rekursion beschränken (dh keine Rekursion als entarteten Fall), wird die Menge der Rekursion, die Sie ausführen können, durch die Größe der Abfrage begrenzt, sodass alle Berechnungen abgebrochen werden. Sie benötigen also eine allgemeine Rekursion für die Turing-Vollständigkeit.

Und wenn Sie eine allgemeine Rekursion haben, können Sie natürlich eine ganze Reihe von Features abschneiden und die Turing-Vollständigkeit beibehalten, einschließlich der allgemeinen Vereinheitlichung (Konstruktion und Musterübereinstimmung auf oberster Ebene sind ausreichend), der Verneinung und des Schnitts.



Sehr guter Punkt. Ich habe nicht über Quantifizierung nachgedacht, aber das ist in der Tat ein anderer Ansatz.
Pseudonym

0

Vervollständigen Sie die ausgezeichnete Antwort mit @Pseudonym und beziehen Sie sich auf Ihre letzte Frage "Sind die Funktionssymbole selbst vollständig?".

Sie meinen wahrscheinlich: Kann eine Sprache, die nur aus Funktionssymbolen besteht, Turing-Complete sein?

Die Antwort lautet Ja - denken Sie an funktionale Programmiersprachen wie ML und Haskell.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.