2017-04-25 59 views
1

爲了好玩,我一直試圖在gprolog中使用Warnsdorf的規則編寫騎士之旅(https://en.wikipedia.org/wiki/Knight%27s_tour)求解器。將表格謂詞從b序列轉換爲gprolog

我發現另一個SO帖子詢問效率,提供了B-序言中的解決方案: knight's tour efficient solution

我的問題,下面的部分出現了:

:- table warnsdorff(+,+,+,+,+,-,-,min). 
warnsdorff(R, C, X, Y, Visits, NewX, NewY, Score) :- 
    possible_knight_moves(R, C, X, Y, Visits, NewX, NewY), 
    possible_moves_count(R, C, NewX, NewY, [(NewX, NewY) | Visits], Score). 

B-Prolog的特點提出謂詞和gprolog沒有。嘗試將表格部分轉換爲gprolog時遇到了很大的困難。在實踐中,函數應該返回從當前位置移動,從而導致可能的移動次數從新位置(關係隨機選擇)。

任何幫助將不勝感激。乾杯!

+1

向Google博士詢問「騎士的旅程序言」。有很多解決方案。 – false

+0

「爲樂趣」類似的問題開始swarm讓我覺得這是一個asignment(請參閱http://stackoverflow.com/questions/43622353/gprolog-knights-tour-using-warnsdorffs-rule和http:// stackoverflow。 com/questions/43628413/simulating-knight-movement-using-prolog) – Rafalon

回答

1

也許,表格對於這個問題是矯枉過正的。由於Visits列表已經在解決進行,只需使用memberchk/2。我得到SWI-Prolog的這個解決方案(其中,順便說一句,提交立法會實現,但無法使用原始編碼您鏈接到解決難題):

?- time(knight(8, 8, 1, 1, [], Path))... 
% 19,973 inferences, 0.019 CPU in 0.019 seconds (100% CPU, 1047591 Lips) 
[(1,1),(2,3),(1,5),(2,7),(4,8),(6,7),(8,8),(7,6),(6,8),(8,7),(7,5),(8,3),(7,1),(5,2),(3,1),(1,2),(2,4),(1,6),(2,8),(3,6),(1,7),(3,8),(5,7),(7,8),(8,6),(7,4),(8,2),(6,1),(4,2),(2,1),(1,3),(3,2),(5,1),(6,3),(8,4),(7,2),(5,3),(4,1),(2,2),(1,4),(3,3),(2,5),(4,4),(6,5),(4,6),(3,4),(5,5),(4,3),(6,2),(8,1),(7,3),(5,4),(3,5),(4,7),(2,6),(1,8),(3,7),(4,5),(6,4),(5,6),(7,7),(5,8),(6,6),(8,5)] 

如果你願意,我可以告訴你的Warnsdorff規則。我使用了setof/3,以獲得最小數量,加入possible_knight_moves/7possible_moves_count/6

編輯

要求:

warnsdorff(R, C, X, Y, Visits, NewX_, NewY_) :- 
    setof((Count, NewX, NewY), (
       possible_knight_moves(R, C, X, Y, Visits, NewX, NewY), 
       possible_moves_count(R, C, NewX, NewY, [(NewX, NewY) | Visits], Count) 
     ), [(_, NewX_, NewY_)|_]). 

爲清楚起見,我已經改名爲輸出變量NewX_,NewY_,但是這無關緊要 - 它與原來的命名工作過。

+0

我同意,但它確實使代碼變得更簡單。如果你能顯示你的Warnsdorff規則,將不勝感激。我不能完全弄清楚你在你的setoff/3中用作目標。 –

+0

啊,這很簡單。我想在早上2點在Prolog中想法並不是要走的路。我遇到了一些奇怪的問題,當not子句(\ + memberchk((NewX,NewY),Visits))給出了一個已經在列表中的NewX和NewY時,possible_knight_moves/7返回'no'。在發生這種情況之前,它會進行大約15次迭代。你修改了其他部分嗎? –

+0

更正:因爲找不到其他動作而失敗。我以前的評論沒有任何意義。 –