2013-04-08 38 views
0

我在序言中實現了隨機搜索。如何在序言中隨機搜索n皇后?

代碼

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。我不明白序言,但我必須執行它。我無法找到哪裏錯了。

回答

1

你應該刪除這條規則:random_sort(_,[]): - !。。這意味着無論是第一個參數,結果都是[]。

+0

謝謝。但它是無限循環。 – 2013-04-08 10:11:09

+0

這是另一個問題。你應該跟蹤你的代碼。 – joel76 2013-04-08 10:57:11