RE:NECESITO UN JUEGO DE PROLOG
Espero que te sirva de ayuda....
Saludos...
Alain Sanchez
% El problema de la zorra, la oca, el grano y el campesino consistente en lo siguiente:
% Suponga que un campesino tiene una zorra, una oca y un saco de granos, y que desea cruzar un río.
% Para eso tiene un bote en el que puede cruzar el río con uno solo de los otros elementos
% (zorra, oca o grano). En cada viaje, en cualquiera de los dos sentidos, debe viajar el campesino
% ya que es el que debe remar. En un inicio están los 4 de un lado del río y el objetivo final es
% que estén los 4 del otro lado. Hay dos restricciones importantes que son las siguientes.
% Cuando el campesino no está, no pueden quedar juntos la zorra y la oca porque la primera se come
% a la segunda. Tampoco pueden quedar junto la oca y el grano porque la primera se come al segundo.
% El objetivo es encontrar la secuencia de viajes que permita realizar el paso del río.
% Sugerencia: representar en hechos los movimientos posibles que pueden hacerse con el bote,
% y en otros hechos los estados prohibidos.
% --- Solucion ---
% #region Datos del problema
% Estado inicial y final
% orden de la estructura estado(Hombre, Zorra, Oca, Grano)
% - en el estado inicial todos estan en la orilla izquierda
inicio(estado('orilla 1', 'orilla 1', 'orilla 1', 'orilla 1')).
% - en el estado final todos estan en la orilla derecha
final(estado('orilla 2', 'orilla 2', 'orilla 2', 'orilla 2')).
% Lados seguros ...
% - cuando el Hombre y la Oca estan en le mismo lado
sin_problemas(estado(X, _, X, _)).
% - cuando la Zorra y el Grano estan en la misma orilla y la Oca esta en la orilla opuesta
sin_problemas(estado(_, Z, O, G)):- lado_opuesto(Z, O), lado_opuesto(O, G).
% Movimientos posibles ...
% - viaja el Hombre solo de una orilla a otra
ir_desde(estado(X, Z, O, G), estado(Y, Z, O, G)):- lado_opuesto(X, Y).
% - viaja el Hombre y la Zorra de una orilla a otra
ir_desde(estado(X, X, O, G), estado(Y, Y, O, G)):- lado_opuesto(X, Y).
% - viaja el Hombre y la Oca de una orilla a otra
ir_desde(estado(X, Z, X, G), estado(Y, Z, Y, G)):- lado_opuesto(X, Y).
% - viaja el Hombre y el Grano de una orilla a otra
ir_desde(estado(X, Z, O, X), estado(Y, Z, O, Y)):- lado_opuesto(X, Y).
% Mostrar las soluciones posibles
% - viaja el Hombre solo de una orilla a otra
muestre_movida(estado(X, Z, O, G), estado(Y, Z, O, G)) :-
write('el Hombre cruza desde la '), write(X), write(' a la '), write(Y),
write_ln('.').
% - viaja el Hombre y la Zorra de una orilla a otra
muestre_movida(estado(X, X, O, G), estado(Y, Y, O, G)) :-
write('el Hombre cruza desde la '), write(X), write(' a la '), write(Y),
write_ln(' con la Zorra.').
% - viaja el Hombre y la Oca de una orilla a otra
muestre_movida(estado(X, Z, X, G), estado(Y, Z, Y, G)) :-
write('el Hombre cruza desde la '), write(X), write(' a la '), write(Y),
write_ln(' con la Oca.').
% - viaja el Hombre y el Grano de una orilla a otra
muestre_movida(estado(X, Z, O, X), estado(Y, Z, O, Y)) :-
write('el Hombre cruza desde la '), write(X), write(' a la '), write(Y),
write_ln(' con el Grano.').
% Funciones auxiliares...
lado_opuesto('orilla 1', 'orilla 2').
lado_opuesto('orilla 2', 'orilla 1').
% #endregion Datos del problema
% El programa que resuelve el problema general de ir del estado inicial
% a alguno final via movidas legales pasando solo por estados seguros
solucion :- inicio(E), resolver(E, [E], R), mostrar_solucion(R).
% resolver(E, C, R) realiza una busqueda en profundidad donde :
% E: Estado de partida
% C: Camino recorrido hasta aca (en reversa)
% R: Camino total hasta la solucion (en reversa)
resolver(E, C, C) :- final(E).
resolver(E, C, R) :- ir_desde(E, E1), not(member(E1, C)), sin_problemas(E1),
resolver(E1, [E1|C], R).
mostrar_solucion([_]).
mostrar_solucion([E1, E2 | T]) :- mostrar_solucion([E2|T]),
muestre_movida(E2, E1).