Subido por Symmetry Ohara

CanibalesDan

Anuncio
% Inicio de la búsqueda
buscar :busqueda([3,3,izq],[0,0,der],[[3,3,izq]],_).
% Imprimir la salida
salida([]):- nl, nl.
salida([[A,B,String]|T]) :salida(T),
write(B), write('~~'), write(A), write(':'), write(String), nl.
% Caso base
busqueda([A,B,C],[A,B,C],_,Moverlista):nl,nl,salida(Moverlista).
% Llamada recursiva
busqueda([A,B,C],[D,E,F],Transicion,Movimiento) :move([A,B,C],[I,J,K],Salida),
legal([I,J,K]), % No usar este movimiento a menos que sea seguro.
not(pertenece([I,J,K],Transicion)),
busqueda([I,J,K],[D,E,F],[[I,J,K]|Transicion],[[[I,J,K],[A,B,C],Salida] |
Movimiento]).
pertenece(X,[X|_]).
pertenece(X,[_|Y]):-pertenece(X,Y).
% Comandos de movimiento y descripciones del movimiento
move([A,B,izq],[C,B,der],'Un misionero cruzo el rio') :- A > 0, C is A1.
move([A,B,izq],[C,B,der],'Dos misioneros cruzaron el rio') :- A > 1, C is
A- 2.
move([A,B,izq],[C,D,der],'Un misionero y un canibal cruzaron el rio') :A > 0, B > 0, C is A- 1, D is B - 1.
move([A,B,izq],[A,D,der],'Un canibal cruzo el rio') :- B > 0, D is B - 1.
move([A,B,izq],[A,D,der],'Dos canibales cruzaron el rio') :- B > 1, D is
B - 2.
move([A,B,der],[C,B,izq],'Un misionero regreso del otro lado') :- A < 3,
C is A + 1.
move([A,B,der],[C,B,izq],'Dos misioneros regresaron del otro lado') :- A
< 2, C is A + 2.
move([A,B,der],[C,D,izq],'Un misionero y un canibal regresaron del otro
lado') :- A < 3, B < 3, C is A + 1, D is B + 1.
move([A,B,der],[A,D,izq],'Un canibal regreso del otro lado') :- B < 3, D
is B + 1.
move([A,B,der],[A,D,izq],'Dos canibales regresaron del otro lado') :- B <
2, D is B + 2.
% Movimientos permitidos
legal([B,A,_]) :(A=<B;B=0),
C is 3-A,
D is 3-B,
(C=<D; D = 0).
Descargar