2009-05-10 14 views
5

Ich schreibe ein Text-Adventure-Spiel in Prolog, und ich drucke Raum-Exits. Ich habe Code, der tut:Alle Lösungen zu einem Prädikat in Prolog bekommen

exits_from(Room) :- 
    connected(Room, X), 
    write(X), write(' '). 

wo/2 angeschlossen ist:

connected(X, Y) :- path(X, Y). 
connected(X, Y) :- path(Y, X). 

und Pfad ist:

path(room, hallway). 
path(hallway, foyer). 

und so weiter.

Wenn ich die Ausgänge für ein Zimmer drucke, bekommt es zuerst, dann will ein ';' zu sagen, dass ich eine andere Lösung möchte. Gibt es trotzdem ein Prädikat, um das Ergebnis vollständig zu berechnen, damit der Spieler nicht mehr nach weiteren Exits fragen muss?

Antwort

14

ein Weg ist so etwas wie

print_all_solutions :- 
    solution(Sol), 
    write(Sol), 
    fail. % this causes backtracking 
print_all_solutions. % succed 

andere forall besondere Prädikat zu verwenden ist, zu tun, wie folgt:

forall(solution(Sol), write(Sol)) 
+0

Ist forall für einige Implementierungen eingebaut? Es ist offensichtlich nicht gültig in gprolog. Aber danke für den Backtracking-Tipp! – Kai

+0

Nach diesem http://www.gprolog.org/manual/gprolog.html#htoc103 gprolog hat findall/3. – pfctdayelise

+0

findall/3 ist nicht dasselbe wie forall/2. – Kaarel

Verwandte Themen