Die folgende Sitzung bezieht sich auf die Programme
P100
und
P101:
:- vorwaerts_trace.
1. Runde:
anfrage(r(a, _X))
anfrage((t(a, Y), t(Y, _X)))
2. Runde:
anfrage(wahr)
ausgewertet(r(a, b))
3. Runde:
ausgewertet(t(a, b))
4. Runde:
anfrage(t(b, _X))
5. Runde:
anfrage(r(b, _X))
anfrage((t(b, Y), t(Y, _X)))
6. Runde:
ausgewertet(r(b, c))
7. Runde:
ausgewertet(t(b, c))
8. Runde:
anfrage(t(c, _X))
ausgewertet((t(a, b), t(b, c)))
9. Runde:
anfrage(r(c, _X))
anfrage((t(c, Y), t(Y, _X)))
ausgewertet(t(a, c))
10. Runde:
ausgewertet(r(c, a))
11. Runde:
ausgewertet(t(c, a))
12. Runde:
ausgewertet((t(a, c), t(c, a)))
ausgewertet((t(b, c), t(c, a)))
ausgewertet((t(c, a), t(a, b)))
ausgewertet((t(c, a), t(a, c)))
13. Runde:
ausgewertet(t(a, a))
ausgewertet(t(b, a))
ausgewertet(t(c, b))
ausgewertet(t(c, c))
14. Runde:
ausgewertet((t(a, b), t(b, a)))
ausgewertet((t(a, c), t(c, b)))
ausgewertet((t(a, c), t(c, c)))
ausgewertet((t(a, a), t(a, b)))
ausgewertet((t(a, a), t(a, c)))
ausgewertet((t(a, a), t(a, a)))
ausgewertet((t(b, c), t(c, b)))
ausgewertet((t(b, c), t(c, c)))
ausgewertet((t(b, a), t(a, b)))
ausgewertet((t(b, a), t(a, c)))
ausgewertet((t(b, a), t(a, a)))
ausgewertet((t(c, a), t(a, a)))
ausgewertet((t(c, b), t(b, c)))
ausgewertet((t(c, b), t(b, a)))
ausgewertet((t(c, c), t(c, a)))
ausgewertet((t(c, c), t(c, b)))
ausgewertet((t(c, c), t(c, c)))
15. Runde:
ausgewertet(t(b, b))
16. Runde:
ausgewertet((t(a, b), t(b, b)))
ausgewertet((t(b, b), t(b, c)))
ausgewertet((t(b, b), t(b, a)))
ausgewertet((t(b, b), t(b, b)))
ausgewertet((t(c, b), t(b, b)))
yes.
:- setof(t(a, Y), ausgewertet(t(a, Y)), Set).
Y = Y
Set = [t(a, a), t(a, b), t(a, c)]
yes.
Die PROLOG-Auswertung beruht auf linearen Resolutionsbeweisen (siehe Kapitel 2
"Prinzipien der Auswertung von PROLOG-Programmen"), die keinen Vergleich von
Anfragen durchführt. Aus diesem Grund terminiert die PROLOG-Auswertung eines
Programmes wie
P101 nicht.
Die mit Programm
P100
implementierte rückwärtsschließende Auswertungsmethode
terminiert immer, wenn das Objektprogramm weder Negation
noch Funktionssymbole enthält. Erweiterungen des Ansatzes zur Behandlung der
Negation sind vorgeschlagen worden. Bisher ist kein Ansatz bekannt, der gute
Terminierungseigenschaften hätte, wenn das Objektprogramm Funktionssymbole
enthält. Die Terminierung in diesem letzten Fall kann prinzipiell nicht
garantiert werden, weil mit rückwärts ausgewerteten, negationsfreien Regeln und
Fakten, in denen Funktionssymbole vorkommen, eine Turingmaschine simuliert
werden kann.
H :- B
darstellen. Wo aber in den unten angegebenen Programmen ein AufrufH <- B
steht, kann man nichtH :- B
verwenden. Anstelle vonH :- B
, dessen Aufruf in PROLOG zu einem Fehler führt, verlangt PROLOG die Schreibweiseclause(H, B)
.wahr
als Rumpf dargestellt. Zum Preis eines weiteren Relationssymbols neben<-
,anfrage
undausgewertet
kann diese Annahme aufgehoben werden.