Primeiro programa das rainhas

^^^prolog

queens(N,L) :- list(N,L0), permutação(L0,L), write(L),nl, teste(L, 1).

% mais rápida % número, var list(0,[]) :- !. list(I,[I|L0]):- I1 is I-1, list(I1,L0).

% mais declarativa %5 mais lenta: verificar a segunda regra.. lista(0,[]). lista(I,[I|L0]):- I > 0, I1 is I-1, lista(I1,L0).

%list(0, [2]). %1,2,3,4 %2,1,3,4 %2,3,4,1 %1,3,2,4

permutação([],[]). permutação(Lista, [El|NLista]) :- delete(El,Lista,Resto), permutação(Resto, NLista).

delete(El,[El|Resto],Resto). delete(El,[Cabeça|Lista],[Cabeça|RestodaLista]) :- delete(El, Lista, RestodaLista).

teste([], _). teste([X|Els], I) :- I1 is I+1, rainha(I, X, I1, Els), teste(Els, I1).

rainha(I,J,I1,Els) :- write(I),nl, não_ataca(I, J, I1, Els).

não_ataca(, , _,[]). não_ataca(I, J, I1, [J1|Els]) :- J\= J1, I+J =\= I1+J1, I-J =\= I1-J1, I2 is I1+1, write(I2),nl, não_ataca(I, J, I2, Els).

^^^