Advertisement
Guest User

Untitled

a guest
May 28th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 8.59 KB | None | 0 0
  1. % Autor:
  2. % Fecha: 28/05/2010
  3.  
  4. % Author: LFaletti y RFerroMoreno
  5.  
  6. % Prolog
  7.  
  8. :- dynamic recorrido/3.
  9.  
  10. :- dynamic ocupado/3.
  11.  
  12. %:- dynamic recorrido/3.
  13.  
  14. %jugada_Valida(COLOR,X,Y):-not ocupado(COLOR,X,Y), not suicidio(COLOR,X,Y).
  15.  
  16. jugada_Valida(COLOR,X,Y):- not(ocupado(_,X,Y)).
  17.  
  18.  
  19.  
  20. %es_capturada(COLOR,X,Y):-es_capturada(
  21.  
  22. %suicidio(b,X,Y):-
  23.  
  24.  
  25.  
  26.  
  27.  
  28. %solve(C,1):-clause(C,B), B==true.
  29.  
  30. %solve((C,C2),CANT):-solve(C,CANT1),solve(C2,CANT2),CANT is CANT1+CANT2.
  31.  
  32. %solve(C,CANT):-clause(C,BODY), BODY\==true, solve(BODY,CANT2), CANT is CANT2+1.
  33.  
  34.  
  35.  
  36.  
  37.  
  38. solve(true).
  39.  
  40. solve((A,B)):- solve(A), solve(B).
  41.  
  42. solve(A):- clause(A,B), B\==true, solve(B).
  43.  
  44.  
  45.  
  46. and(A,B):- solve(A), solve(B).
  47.  
  48. andE(A,B,C,D):- solve(A), solve(B), solve(C), solve(D).
  49.  
  50.  
  51.  
  52. %capt(C,X,Y):- X1 is X-1, X2 is X+1, Y1 is Y-1, Y2 is Y+1, NC\==C,
  53.  
  54. %              (ocupado(NC,X1,Y) ; (ocupado(C,X1,Y), recorrido(C,X1,Y)) ; (ocupado(C,X1,Y),not(recorrido(C,X1,Y)), assert(recorrido(C,X,Y)), capt(C,X1,Y), retract(recorrido(C,X,Y)))),
  55.  
  56. %              (ocupado(NC,X2,Y) ; (ocupado(C,X2,Y), recorrido(C,X2,Y)) ; (ocupado(C,X2,Y),not(recorrido(C,X2,Y)), assert(recorrido(C,X,Y)), capt(C,X2,Y), retract(recorrido(C,X,Y)))),
  57.  
  58. %              (ocupado(NC,X,Y1) ; (ocupado(C,X,Y1), recorrido(C,X,Y1)) ; (ocupado(C,X,Y1),not(recorrido(C,X,Y1)), assert(recorrido(C,X,Y)), capt(C,X,Y1), retract(recorrido(C,X,Y)))),
  59.  
  60. %              (ocupado(NC,X,Y2) ; (ocupado(C,X,Y2), recorrido(C,X,Y2)) ; (ocupado(C,X,Y2),not(recorrido(C,X,Y2)), assert(recorrido(C,X,Y)), capt(C,X,Y2), retract(recorrido(C,X,Y)))).
  61.  
  62.  
  63.  
  64. % capt(C,X,Y):- X1 is X-1, X2 is X+1, Y1 is Y-1, Y2 is Y+1, NC\==C,
  65. %               ocupado(C1,X1,Y),
  66. %               ocupado(C2,X2,Y),
  67. %               ocupado(C3,X,Y1),
  68. %               ocupado(C4,X,Y2),
  69. %               (ocupado(NC,X1,Y) ; (ocupado(C,X1,Y), recorrido(C,X1,Y)) ; (ocupado(C,X1,Y),not(recorrido(C,X1,Y)),recorrido(C,X,Y),capt(C,X1,Y)) ; (ocupado(C,X1,Y),not(recorrido(C,X1,Y)), not(recorrido(C,X,Y)), assert(recorrido(C,X,Y)), capt(C,X1,Y))),
  70. %
  71. %               (ocupado(NC,X2,Y) ; (ocupado(C,X2,Y), recorrido(C,X2,Y)) ; (ocupado(C,X2,Y),not(recorrido(C,X2,Y)),recorrido(C,X,Y),capt(C,X2,Y)) ; (ocupado(C,X2,Y),not(recorrido(C,X2,Y)), not(recorrido(C,X,Y)), assert(recorrido(C,X,Y)), capt(C,X2,Y))),
  72. %
  73. %               (ocupado(NC,X,Y1) ; (ocupado(C,X,Y1), recorrido(C,X,Y1)) ; (ocupado(C,X,Y1),not(recorrido(C,X,Y1)),recorrido(C,X,Y),capt(C,X2,Y)) ; (ocupado(C,X,Y1),not(recorrido(C,X,Y1)), not(recorrido(C,X,Y)), assert(recorrido(C,X,Y)), capt(C,X,Y1))),
  74. %
  75. %               (ocupado(NC,X,Y2) ; (ocupado(C,X,Y2), recorrido(C,X,Y2)) ; (ocupado(C,X,Y2),not(recorrido(C,X,Y2)),recorrido(C,X,Y),capt(C,X,Y2)) ; (ocupado(C,X,Y2),not(recorrido(C,X,Y2)), not(recorrido(C,X,Y)), assert(recorrido(C,X,Y)), capt(C,X,Y2))).
  76.  
  77. limpiar:-retractall(recorrido(X,Y,Z)).
  78.  
  79. % verificar_captura(b,X,Y):-X1 is X-1, ocupado(n,X1,Y),capt(n,X1,Y).
  80. % verificar_captura(b,X,Y):-X2 is X+1, ocupado(n,X2,Y),capt(n,X2,Y).
  81. % verificar_captura(b,X,Y):-Y1 is Y-1, ocupado(n,X,Y1),capt(n,X,Y1).
  82. % verificar_captura(b,X,Y):-Y2 is Y+1, ocupado(n,X,Y2),capt(n,X,Y2).
  83. %
  84. % verificar_captura(n,X,Y):-X1 is X-1, ocupado(b,X1,Y),capt(b,X1,Y).
  85. % verificar_captura(n,X,Y):-X2 is X+1, ocupado(b,X2,Y),capt(b,X2,Y).
  86. % verificar_captura(n,X,Y):-Y1 is Y-1, ocupado(b,X,Y1),capt(b,X,Y1).
  87. % verificar_captura(n,X,Y):-Y2 is Y+1, ocupado(b,X,Y2),capt(b,X,Y2).
  88.  
  89. capt(b,X,Y):- X1 is X-1, X2 is X+1, Y1 is Y-1, Y2 is Y+1,
  90.               ocupado(C1,X1,Y),
  91.               ocupado(C2,X2,Y),
  92.               ocupado(C3,X,Y1),
  93.               ocupado(C4,X,Y2),
  94.               ( ocupado(n,X1,Y) ; ocupado(p,X1,Y) ; ( ocupado(b,X1,Y), (recorrido(b,X1,Y) ; (not(recorrido(b,X1,Y)), assert(recorrido(b,X,Y)), capt(b,X1,Y))))),
  95.  
  96.               ( ocupado(n,X2,Y) ; ocupado(p,X2,Y) ; ( ocupado(b,X2,Y), (recorrido(b,X2,Y) ; (not(recorrido(b,X2,Y)), assert(recorrido(b,X,Y)), capt(b,X2,Y))))),
  97.  
  98.               ( ocupado(n,X,Y1) ; ocupado(p,X,Y1) ; ( ocupado(b,X,Y1), (recorrido(b,X,Y1) ; (not(recorrido(b,X,Y1)), assert(recorrido(b,X,Y)), capt(b,X,Y1))))),
  99.  
  100.               ( ocupado(n,X,Y2) ; ocupado(p,X,Y2) ; ( ocupado(b,X,Y2), (recorrido(b,X,Y2) ; (not(recorrido(b,X,Y2)), assert(recorrido(b,X,Y)), capt(b,X,Y2))))).
  101.  
  102. capt(n,X,Y):- X1 is X-1, X2 is X+1, Y1 is Y-1, Y2 is Y+1,
  103.               ocupado(C1,X1,Y),
  104.               ocupado(C2,X2,Y),
  105.               ocupado(C3,X,Y1),
  106.               ocupado(C4,X,Y2),
  107.               ( ocupado(b,X1,Y) ; ocupado(p,X1,Y) ; ( ocupado(n,X1,Y), (recorrido(n,X1,Y) ; (not(recorrido(n,X1,Y)), assert(recorrido(n,X,Y)), capt(n,X1,Y))))),
  108.  
  109.               ( ocupado(b,X2,Y) ; ocupado(p,X2,Y) ; ( ocupado(n,X2,Y), (recorrido(n,X2,Y) ; (not(recorrido(n,X2,Y)), assert(recorrido(n,X,Y)), capt(n,X2,Y))))),
  110.  
  111.               ( ocupado(b,X,Y1) ; ocupado(p,X,Y1) ; ( ocupado(n,X,Y1), (recorrido(n,X,Y1) ; (not(recorrido(n,X,Y1)), assert(recorrido(n,X,Y)), capt(n,X,Y1))))),
  112.  
  113.               ( ocupado(b,X,Y2) ; ocupado(p,X,Y2) ; ( ocupado(n,X,Y2), (recorrido(n,X,Y2) ; (not(recorrido(n,X,Y2)), assert(recorrido(n,X,Y)), capt(n,X,Y2))))).
  114.              
  115.              
  116. verif(b,X,Y):-X1 is X-1, X2 is X+1, Y1 is Y-1, Y2 is Y+1,
  117.               ( color_capturado(n,X1,Y);color_capturado(n,X2,Y);color_capturado(n,X,Y1);color_capturado(n,X,Y2) ).
  118.              
  119. verif(n,X,Y):-X1 is X-1, X2 is X+1, Y1 is Y-1, Y2 is Y+1,
  120.                  ( color_capturado(b,X1,Y);color_capturado(b,X2,Y);color_capturado(b,X,Y1);color_capturado(b,X,Y2) ).
  121.                  
  122.  
  123. algun_vacio(X,Y):- X1 is X-1, X2 is X+1, Y1 is Y-1, Y2 is Y+1,
  124.                    ( not(ocupado(C1,X1,Y)) ; not(ocupado(C2,X2,Y)) ; not(ocupado(C3,X,Y1)) ; not(ocupado(C4,X,Y2)) ).
  125.  
  126. colores_alrededor(X,Y,IZQ,DER,ARR,ABA):- X1 is X-1, X2 is X+1, Y1 is Y-1, Y2 is Y+1,
  127.                                      ( (not(ocupado(IZQ,X1,Y)), IZQ=v) ; ocupado(IZQ,X1,Y) ),
  128.                                      ( (not(ocupado(DER,X2,Y)), DER=v) ; ocupado(DER,X2,Y) ),
  129.                                      ( (not(ocupado(ABA,X,Y1)), ABA=v) ; ocupado(ABA,X,Y1) ),
  130.                                      ( (not(ocupado(ARR,X,Y2)), ARR=v) ; ocupado(ARR,X,Y2) ).
  131.  
  132.  
  133. %fucking mierda pero buscar no debe fallar nunca porque es un recorredor!
  134. buscar(C,X,Y):-X1 is X-1, X2 is X+1, Y1 is Y-1, Y2 is Y+1,
  135.                   %visitar
  136.                   assert(recorrido(C,X,Y)),
  137.                   %si a izquierda mismo color y no recorrido ent. buscar y no fallar, sino no fallar.
  138.                   ( (ocupado(C,X1,Y), not(recorrido(C,X1,Y)), buscar(C,X1,Y)); ( not(ocupado(C,X1,Y));recorrido(C,X1,Y)) ),
  139.                   %si a derecha mismo color y no recorrido ent. buscar y no fallar, sino no fallar.
  140.                   ( (ocupado(C,X2,Y), not(recorrido(C,X2,Y)), buscar(C,X2,Y)); ( not(ocupado(C,X2,Y));recorrido(C,X2,Y)) ),
  141.                   % arriba
  142.                   ( (ocupado(C,X,Y2), not(recorrido(C,X,Y2)), buscar(C,X,Y2)); ( not(ocupado(C,X,Y2));recorrido(C,X,Y2)) ),
  143.                   % abajo
  144.                   ( (ocupado(C,X,Y1), not(recorrido(C,X,Y1)), buscar(C,X,Y1)); ( not(ocupado(C,X,Y1));recorrido(C,X,Y1)) ).
  145.                  
  146.  
  147. %Un color y coordenadas de punto de partida para buscar (por C)
  148. color_capturado(C,X,Y):- %limpiar cualquier recorrido anterior
  149.                          retractall(recorrido(X,Y,Z)),
  150.                          %obtener bloque hipoteticamente capturado
  151.                          buscar(C,X,Y),
  152.                          % Verificar que cada ficha del bloque tiene en sus adyacentes:
  153.                          %  una ficha de color contrario,
  154.                          %  o bien una ficha del mismo color.
  155.                          
  156.                          % Buscar por todos los recorridos tales que tengan algun espacio vacío alrededor
  157.                          % si R es vacío entonces el conjunto está capturado por el color contrario,
  158.                          % sino no hay captura
  159.                          findall([X_,Y_], ( recorrido(C,X_,Y_),algun_vacio(X_,Y_) ), R),
  160.                          R==[]. %hay captura.
  161.                          
  162. verificar_captura(b,X,Y):-X1 is X-1, ocupado(n,X1,Y),color_capturado(n,X1,Y).
  163. verificar_captura(b,X,Y):-X2 is X+1, ocupado(n,X2,Y),color_capturado(n,X2,Y).
  164. verificar_captura(b,X,Y):-Y1 is Y-1, ocupado(n,X,Y1),color_capturado(n,X,Y1).
  165. verificar_captura(b,X,Y):-Y2 is Y+1, ocupado(n,X,Y2),color_capturado(n,X,Y2).
  166.  
  167. verificar_captura(n,X,Y):-X1 is X-1, ocupado(b,X1,Y),color_capturado(b,X1,Y).
  168. verificar_captura(n,X,Y):-X2 is X+1, ocupado(b,X2,Y),color_capturado(b,X2,Y).
  169. verificar_captura(n,X,Y):-Y1 is Y-1, ocupado(b,X,Y1),color_capturado(b,X,Y1).
  170. verificar_captura(n,X,Y):-Y2 is Y+1, ocupado(b,X,Y2),color_capturado(b,X,Y2).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement