如何在prolog中随机搜索n-queen?

如何在prolog中随机搜索n-queen?,prolog,artificial-intelligence,n-queens,Prolog,Artificial Intelligence,N Queens,我正在prolog中实现随机搜索 代码是 queens_rand([],Qs,Qs) :- !. queens_rand(UnplacedQs,SafeQs,Qs) :- random_sort(UnplacedQs, UnplacedQs1), select(UnplacedQs,UnplacedQs1,Q), not_attack(SafeQs,Q,1), queens_rand(UnplacedQs1,[Q|SafeQs],Qs), !. queen_solve_rand(N) :- al

我正在prolog中实现随机搜索

代码是

queens_rand([],Qs,Qs) :- !.
queens_rand(UnplacedQs,SafeQs,Qs) :-
random_sort(UnplacedQs, UnplacedQs1),
select(UnplacedQs,UnplacedQs1,Q),
not_attack(SafeQs,Q,1),
queens_rand(UnplacedQs1,[Q|SafeQs],Qs),
!.
queen_solve_rand(N) :-
alloc(1,N,Ns),
queens_rand(Ns,[], Q),
write(Q), nl.
random_sort([],_) :- !.
random_sort(_,[]) :- !.
random_sort(Xs, Ys) :-
   length(Ys, L),
   rnd_select(Xs,L, Ys),
   write('Ys : '),write(Ys),nl.

remove_at(X,[X|Xs],1,Xs).
remove_at(X,[Y|Xs],K,[Y|Ys]) :- K > 1, 
K1 is K - 1, remove_at(X,Xs,K1,Ys).

rnd_select(_,0,[]).
rnd_select(Xs,N,[X|Zs]) :- N > 0,
length(Xs,L),
I is random(L) + 1,
remove_at(X,Xs,I,Ys),
N1 is N - 1,
rnd_select(Ys,N1,Zs).

not_attack([],_,_) :- !.
not_attack([Y|Ys],X,N) :-
X =\= Y+N, X =\= Y-N,
N1 is N+1,
not_attack(Ys,X,N1).

select([X|Xs],Xs,X).
select([Y|Ys],[Y|Zs],X) :- select(Ys,Zs,X).

但它返回false。我不能很好地理解prolog,但我必须实现它。我找不到哪里错了。

y你应该删除这个规则:随机排序(u,[]):-。这意味着无论第一个参数是什么,结果都是[]。

谢谢。但它是无限循环。