2016-10-31 125 views
0

我一直試圖通過自己的滑動拼圖版來實現,並且在擴展到較大尺寸之前一直使用較小尺寸的拼圖(2尺寸拼圖)。遞歸調用中的退回項目

,我已創建的序言代碼迄今是

move(1,2,0) :- true. 
move(A,0,B) :- move(A,B,0),!,true. 
move(0,A,B) :- move(A,0,B),!,true. 
move(A,B,0) :- move(A,0,B),!,true. 

對於2大小的難題我有,一個正確的解決難題被給定爲1,2,0。到目前爲止,我所得到的回報在確定一個有效的輸入是否能解決1,2,0的難題方面正確工作。

接下來我試圖實現的是返回導致正確拼圖的一組移動,並且我已經得到它的工作(儘管不完全)。

我修改上面的代碼:

move([X|X],1,2,0) :- true. 
move([X],A,0,B) :- move([left|X],A,B,0),!,true. 
move(0,A,B) :- move(A,0,B),!,true. 
move(A,B,0) :- move(A,0,B),!,true. 

當我鍵入移動(輸入,1,0,2),它正確地給了我[左]這是我所期望的,但是我不知道如何實現它,以便爲移動(1,2,0) - []和移動(0,1,2) - [左|左]提供正確的輸出。

我試過不同的各種編輯無濟於事。我希望得到一些幫助,以瞭解我所做的不正確。

謝謝!

回答

0

你的州代表是什麼人? 我似乎無法將它想象成一個2x2難題。你的看起來像一個1x3的難題,所以我會繼續前進,並假設。

move([],1,2,0) :- true. % Don't need to move -> Empty move list 
move([left|X],A,0,B) :- move(X,A,B,0),!,true.% -> make a move left, Followed by whatever moves you need from (A,B,0) 
move([left|X],0,A,B) :- move(X,A,0,B),!,true. 
move([right|X],A,B,0) :- move(X,A,0,B),!,true. 

您的規則的頭部必須有[ThisMove | RestOfMoves]。

+0

沒有評論其他任何東西,原始問題和答案中的所有「真實」都沒有做任何事情。你可以安全地刪除它們。 –

+0

我知道。我只是保留他們,因爲他們在問題。 – 2bigpigs

+0

非常感謝!這很有意義。 – nelac123