Prolog-Grundzüge 6: Fail

July 21, 2009 at 5:45 pm Leave a comment


Das Prolog-System sucht stets nach allen möglichen Lösungen für eine Anfrage und liefert diese nacheinander als Ergebnis. Nehmen wir einmal an, wir wollen alle Benutzer ausgeben, die wir mit Fakten wie benutzer(stefan). definiert haben. Nehmen wir für unser Beispiel an, wir haben drei Benutzer definiert:

benutzer(stefan).
benutzer(mika).
benutzer(silke).

Dann könnte eine erste Version der Regel zur Ausgabe aller Benutzer so aussehen:

schreibe_alle_benutzer :- benutzer(X), write(X), nl. 

Die Anwendung liefert drei Ergebnisse (in SWI-Prolog “n” nach jedem “true” getippt):

stefan
true;
mika
true;
silke
true

Das ist nicht ganz das, was wir wollen. Wir wollen, dass alle Benutzer auf einmal geschrieben werden. Das können wir dadurch erreichen, dass wir die Regel absichtlich fehlschlagen lassen. Damit zwingen wir das Prolog-System, alle möglichen Belegungen für “X” durchzugehen:

schreibe_alle_benutzer :- benutzer(X), write(X), nl, fail.

Damit erhalten wir:

stefan
mika
silke
false

Das ist schon deutlich besser, aber das “false” am Ende ist etwas störend. Wenn wir “schreibe_alle_benutzer” aus anderen Regeln aufrufen wollen, wird es sogar unangenehm, weil diese Regel immer scheitert. Das Problem lässt sich aber ganz leicht lösen, indem wir das Ergebnis der Regel verodern (; bedeutet in Prolog “oder”):

schreibe_alle_benutzer :- benutzer(X), write(X), nl, fail; true.

Damit erhalten wir:

stefan
mika
silke
true

Entry filed under: 1. Tags: .

Prolog-Grundzüge 5: Rekursion Prolog-Grundzüge 7: Cut-Operator

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed



%d bloggers like this: