Advertisement
Guest User

misioneros.pl

a guest
May 28th, 2019
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 1.74 KB | None | 0 0
  1. %estado(M,C,d) significa M canibales a la derecha, C canibales a la derecha, balsa a la Derecha
  2. %estado(M,C,i) significa M canibales a la derecha, C canibales a la derecha, balsa a la Izquierda
  3. %estado(3,3,d) es el estado inicial
  4. %estado(0,0,i) es el estado final
  5.  
  6. %movimientos posibles: Mover 2 misioneros de lado, mover 2 canibales de lado, mover 1 misionero o 1 canibales
  7. %estado correcto: 0 misioneros cualquier canibal o M >= C
  8.  
  9. unPaso([M,C,d],[M2,C,i]):-
  10.     M2 is M - 2,
  11.     M2 >= 0.   
  12. unPaso([M,C,d],[M,C2,i]):-
  13.     C2 is C - 2,
  14.     C2 >= 0.
  15. unPaso([M,C,d],[M2,C,i]):-
  16.     M2 is M - 1,
  17.     M2 >= 0.
  18. unPaso([M,C,d],[M,C2,i]):-
  19.     C2 is C - 1,
  20.     C2 >= 0.
  21. unPaso([M,C,d],[M2,C2,i]):-
  22.     M2 is M - 1,
  23.     C2 is C - 1,
  24.     M2 >= 0,
  25.     C2 >= 0.
  26.    
  27. unPaso([M,C,i],[M2,C,d]):-
  28.     M2 is M + 2,
  29.     M2 < 4.
  30. unPaso([M,C,i],[M,C2,d]):-
  31.     C2 is C + 2,
  32.     C2 < 4.
  33. unPaso([M,C,i],[M2,C,d]):-
  34.     M2 is M + 1,
  35.     M2 < 4.
  36. unPaso([M,C,i],[M,C2,d]):-
  37.     C2 is C + 1,
  38.     C2 < 4.
  39. unPaso([M,C,i],[M2,C2,d]):-
  40.     M2 is M + 1,
  41.     C2 is C + 1,
  42.     M2 < 4,
  43.     C2 < 4.
  44.    
  45. estadoOK([0,_,_]).
  46. estadoOK([M,C,_]):-
  47.     M >= C.
  48.    
  49. nat(0).
  50. nat(N):-
  51.     nat(N1),
  52.     N is N1 + 1.
  53.  
  54. camino( E,E, C,C ).
  55. camino( EstadoActual, EstadoFinal, CaminoHastaAhora, CaminoTotal ):-
  56.     unPaso( EstadoActual, EstSiguiente ),
  57.     estadoOK(EstSiguiente),
  58.     \+member(EstSiguiente,CaminoHastaAhora),
  59.     camino( EstSiguiente, EstadoFinal, [EstSiguiente|CaminoHastaAhora], CaminoTotal ).
  60. solucionOptima:-
  61.     nat(N), % Buscamos solucion de "coste" 0; si no, de 1, etc.
  62.     camino([3,3,d],[0,0,i],[[3,3,d]],C),
  63.     length(C,N),
  64.     reverse(C,S),
  65.     write("Coste de la solucion: "), write(N), nl,
  66.     prettyPrint(S,1).
  67.    
  68. prettyPrint([],_).
  69. prettyPrint([X|S],N):-
  70.     write("Estado "), write(N), write(": "), write(X), nl,
  71.     N1 is N + 1,
  72.     prettyPrint(S,N1).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement