Guest User

Untitled

a guest
Aug 2nd, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Prolog 2.74 KB | None | 0 0
  1. :- set_prolog_flag(toplevel_print_options,
  2.            [quoted(true), portray(true), max_depth(120),
  3.             priority(699)]).
  4. :- pce_image_directory('/home/alex/prog/prolog/').
  5.  
  6. resource(tablero, image, image('tablero-ajedrez.jpg')).
  7. resource(reina, image, image('reina.jpg')).
  8.  
  9. inicio :-
  10.     b_setval(contador,1),
  11.     new(@ventana, window('Solucion de las 8 reinas', size(600,600))),
  12.     new(D, dialog('Control de 8 reinas')),
  13.     new(@boton1, button('Limpiar', message(@prolog,limpiar))),
  14.     new(@boton2, button('Siguiente', message(@prolog, siguiente))),
  15.     new(@boton3, button('Finalizar', message(@prolog, fin, D))),
  16.     new(@boton4, label('nombLabel', '0')),
  17.     send(D, append(@boton1)),
  18.     send(D, append(@boton2)),
  19.     send(D, append(@boton3)),
  20.     send(D, append(@boton4)),
  21.     send(D, open).
  22.  
  23. halla_abcisa(Y,NY) :- NY is 86 + 53*(Y - 1).
  24.  
  25. ajedrez([Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8]) :-
  26.     nueva_imagen(tablero, point(40,40)),
  27.     halla_abcisa(Y1,NY1),
  28.     nueva_imagen(reina,point(NY1,87)),
  29.     halla_abcisa(Y2,NY2),
  30.     nueva_imagen(reina,point(NY2,140)),
  31.     halla_abcisa(Y3,NY3),
  32.     nueva_imagen(reina,point(NY3,193)),
  33.     halla_abcisa(Y4,NY4),
  34.     nueva_imagen(reina,point(NY4,246)),
  35.     halla_abcisa(Y5,NY5),
  36.     nueva_imagen(reina,point(NY5,299)),
  37.     halla_abcisa(Y6,NY6),
  38.     nueva_imagen(reina,point(NY6,352)),
  39.     halla_abcisa(Y7,NY7),
  40.     nueva_imagen(reina,point(NY7,405)),
  41.     halla_abcisa(Y8,NY8),
  42.     nueva_imagen(reina,point(NY8,458)),send(@ventana,open).
  43.  
  44. nueva_imagen(Imagen, Posicion) :-
  45.     new(Figura, figure),
  46.     new(Bitmap, bitmap(resource(Imagen),@on)),
  47.     send(Bitmap, name, 1),
  48.     send(Figura, display, Bitmap),
  49.     send(Figura, status, 1),
  50.     send(@ventana, display, Figura, Posicion).
  51.  
  52. limpiar :-
  53.     nueva_imagen(tablero,point(40,40)),
  54.     send(@ventana,flush).
  55.  
  56. siguiente :-
  57.     b_getval(contador, C),
  58.     ( C = [] -> K is 1
  59.     ;
  60.     K is C
  61.     ),
  62.     todas_las_soluciones(LL),
  63.     length(LL,M),
  64.     b_setval(maximo,M),
  65.     nth1(K,LL,L),
  66.     ajedrez(L),
  67.     send(@boton4,selection,K),
  68.     K1 is K + 1,
  69.     b_setval(contador, K1),!.
  70.  
  71. siguiente :- K is 1, b_setval(contador,K).
  72.  
  73. anterior :-
  74.     b_getval(contador, C),
  75.     K1 is C - 2,
  76.     C > 2,
  77.     b_setval(contador,K1),
  78.     siguiente,!.
  79.        
  80. anterior :-
  81.     K is 92,b_setval(contador,K),siguiente.
  82.  
  83.  
  84. fin(Dialogo) :-
  85.     send(@ventana,free),
  86.     send(@boton1,free),
  87.     send(@boton2,free),
  88.     send(@boton3,free),
  89.     send(@boton4, free),
  90.     send(Dialogo,destroy),
  91.     send(Dialogo,free).
  92.  
  93. todas_las_soluciones(LL) :- findall(L,reinas(L),LL).
  94.  
  95. solucion([]).
  96. solucion([[X,Y]|Otros]) :-
  97.     solucion(Otros),
  98.     member(Y,[1,2,3,4,5,6,7,8]),
  99.     noataca([X,Y],Otros).
  100.  
  101. noataca(_,[]).
  102. noataca([X,Y],[[X1,Y1]|Otros]) :-
  103.     Y =\= Y1,
  104.     Y1 - Y =\= X1 - X,
  105.     Y1 - Y =\= X - X1,
  106.     noataca([X,Y],Otros).
  107.  
  108. reinas(L) :-
  109.     L1 = [[1,Y1],[2,Y2],[3,Y3],[4,Y4],[5,Y5],[6,Y6],[7,Y7],[8,Y8]],
  110.     solucion(L1),
  111.     L = [Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8].
Add Comment
Please, Sign In to add comment