Prolog Materialien Installation Grundlagen Eigenheiten Berechnungskonzept Listen Schleifen Mengen globale Variablen Datenbanken Arithmetik Ableiten Graphen Cut findall failure-driven-loop Akkumulator Grafik rapid prototyping Logik Rätsel Grammatik Syntax Glossar
Pfad: Startseite / Fächer / Informatik / Prolog / failure-driven-loop
Autor: mk
03.04.2007 13:44
910
failure-driven-loop

Hat man folgende Wissensbasis

cool(peter).
cool(norman):-cool(freddy).
cool(dmitri):-cool(mark),cool(patrice).
cool(mark):-cool(norman).
cool(freddy):-cool(peter).
cool(patrice):-cool(mark).

so interessiert man sich dafür, wer nun alles cool ist. Die Anfrage ?- cool(X). liefert auch alle Lösungen, wobei jede neue Lösung neu vom System angefordert werden muss.
Mit Hilfe des System-Prädikats fail, das immer schiefgeht aber Backtracking erzwingt, kann man Folgendes erreichen:

?- cool(X),write(X),nl,fail.
peter
norman
dmitri
mark
freddy
patrice

No

Die Schleife besteht also darin, dass alle Backtracking-Möglichkeiten ausgeschöpft werden.

Will man wissen, wieviele cool sind oder die Namen der Coolen sortieren, so wäre es schön eine Liste der Lösungen zu haben. Genau das leistet das Systemprädikat findall.

?- findall(X,cool(X),L).

X = _G157
L = [peter, norman, dmitri, mark, freddy, patrice] ;

No