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]).
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?
Antworten:
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
,assert
usw. 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.
quelle
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.
quelle