In Prolog, ist die Vereinigung X = [1|X]
ein vernünftiger Weg, um eine unendliche Liste von Einsen zu erhalten?
Es hängt davon ab, ob Sie es für vernünftig halten, eine unendliche Liste überhaupt zu erstellen. In ISO-Prolog unterliegt eine Vereinheitlichung wie X = [1|X]
der Vorkommnisprüfung (STO) und ist somit undefiniert. Das heißt, ein standardkonformes Programm darf ein solches Ziel nicht ausführen. Um dies zu vermeiden, gibt es unify_with_occurs_check/2
, subsumes_term/2
. Und um Interfaces gegen den Empfang von unendlichen Termen zu schützen, gibt es acyclic_term/1
.
Alle aktuellen Implementierungen enden für X = [1|X]
. Auch GNU Prolog beendet:
| ?- X = [1|X], acyclic_term(X).
no
Aber für komplexere Fälle, rationale Baum Vereinigung erforderlich. Vergleichen Sie dies mit Haskell, wo repeat 1 == repeat 1
ghci
zum Einfrieren verursacht.
Wie für rationale Bäume in regulären Prolog-Programmen, das ist am Anfang ziemlich interessant, aber nicht sehr gut.Als Beispiel wurde Anfang der 1980er Jahre angenommen, dass Grammatiken unter Verwendung von rationalen Bäumen implementiert werden. Leider sind die Menschen mit DCG allein zufrieden. Ein Grund, warum dies die Forschung nicht verlässt, ist, weil viele Begriffe, von denen Prolog-Programmierer annehmen, dass sie existieren, für rationale Bäume nicht existieren. Nehmen Sie als Beispiel die lexikografische Termordnung, die keine Erweiterung für rationale Bäume hat. Das heißt, es gibt rationale Bäume, die nicht mit der Standard-Term-Reihenfolge verglichen werden können. (Praktisch bedeutet dies, dass Sie quasi zufällige Ergebnisse erhalten.) Dies bedeutet, dass Sie keine sortierte Liste mit solchen Begriffen erstellen können. Das bedeutet wiederum, dass viele Einbauten wie bagof/3
nicht mehr zuverlässig mit unendlichen Termen arbeiten.
Für Ihre Beispielabfrage, sollten Sie die folgende Definition:
memberd(X, [X|_Xs]).
memberd(E, [X|Xs]) :-
dif(E,X),
memberd(E, Xs).
?- X = 1, Xs=[1|Xs], memberd(X,Xs).
X = 1,
Xs = [1|Xs] ;
false.
So manchmal gibt es einfache Möglichkeiten, Nicht-Beendigung zu entkommen. Aber meistens gibt es keine.