2009-05-10 10 views
5

Estoy escribiendo un juego de texto y aventuras en Prolog, y estoy imprimiendo salidas de salas. Tengo el código que hace:Obteniendo todas las soluciones a un predicado en Prolog

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

donde conectado/2 es:

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

y la ruta es:

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

y así sucesivamente.

Cuando estoy imprimiendo las salidas de una habitación, obtiene la primera, luego quiere un ';' para decir que quiero otra solución. ¿Hay alguna forma de obligar a un predicado a calcular el resultado por completo, para que el jugador no tenga que seguir pidiendo más salidas?

Respuesta

14

es una forma de hacer algo como

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

otra es utilizar el predicado especial forall, como sigue:

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

se construye en forall para algunas implementaciones? No es válido en gprolog aparentemente. ¡Pero gracias por la sugerencia de retroceder! – Kai

+0

De acuerdo con este http://www.gprolog.org/manual/gprolog.html#htoc103 gprolog tiene findall/3. – pfctdayelise

+0

findall/3 no es lo mismo que forall/2. – Kaarel

Cuestiones relacionadas