necesito un programa en prolog

lachy
18 de Junio del 2006
Necesito un programa en prolog que me permita dar las posibles soluciones de un tablero con 8 reinas.

RuMbOiDe
18 de Junio del 2006
Mira, me voy a portar muy bien contigo. Aunque te lo de hecho te aconsejo ke te lo mires bien e intentes entenderlo. Disfrutalo. Salud.

%solucion(Pos), verdadero si las 8 reinas no se atacan
vector(Sol):- Sol = [c(1,_),c(2,_),c(3,_),c(4,_),c(5,_),c(6,_),c(7,_),c(8,_)],vector(Sol).

%solucion(L), L es una lista con las posiciones desde las que las reinas no pueden atacarse.
solucion([]).
solucion([c(X,Y)|Resto]):-solucion(Resto).
member(Y,[1,2,3,4,5,6,7,8]),not ataca(c(X,Y),Resto).

%ataca(c(X,Y),L),la reina en c(X,Y) ataca a alguna de las situadas en las posiciones de L.
ataca(c(_,Y),[c(_,Y1)|_]):-Y=:=Y1,!. %Misma Horizontal
ataca(c(X,Y),[c(X1,Y1)|_]):-Y1 is X1 + (Y-X),!. %La misma diagonal de pendiente 1
ataca(c(X,Y),[c(X1,Y1)|_]):-Y1 is (Y+X) - X1,!. %La misma diagonal de pendiente -1
ataca(c(X,Y),[c(_,_)|Resto]:-ataca(c(X,Y),Resto).%En cualquier otro caso

%muestra el tablero y la solucion
tablero(Sol):-vector(Sol),esc_cabecera,esc_tablero(Sol).

esc_cabecera:-nl,nl,nl,
tab(3),write('---------------------------------'),nl,
tab(3),write('! 1 ! 2 ! 3 ! 4 ! 5 ! 6 ! 7 ! 8 !'),nl,
tab(3),write('---------------------------------'),nl.

esc_tablero([]).
esc_tablero([c(N,R)|Resto]):-esc_fila(N,R),esc_tablero(Resto).

esc_fila(N,R):-tab(2),write(N),esc_casillas(R),nl,tab(3),write('-------------------------------'),nl.

esc_casillas(1):-write('! * ! ! ! ! ! ! ! !').
esc_casillas(2):-write('! ! * ! ! ! ! ! ! !').
esc_casillas(3):-write('! ! ! * ! ! ! ! ! !').
esc_casillas(4):-write('! ! ! ! * ! ! ! ! !').
esc_casillas(5):-write('! ! ! ! ! * ! ! ! !').
esc_casillas(6):-write('! ! ! ! ! ! * ! ! !').
esc_casillas(7):-write('! ! ! ! ! ! ! * ! !').
esc_casillas(8):-write('! ! ! ! ! ! ! ! * !').