% 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).