2012-05-26 103 views
2

我試圖做河內塔問題的,我所到目前爲止已經試過:漢諾塔(河內塔)

move(1,[H|T],B,C,A1,B1,C) :- 
    A1 = T, 
    B1 = [H|B]. 
move(N,A,B,C,A1,B1,C) :- 
N>1, 
M is N-1, 
move(M,[H|T],C,B,A1,B1,C), 
move(1,[H|T],B,_,A1,B1,C), 
move(M,C,B,[H|T],A1,B1,C). 

但是這個代碼不工作,我需要得到的結果是長相像這樣:

?-move(3,[1,2,3],[],[],A1,B1,C). 
    and the results: 
    A1=[]. 
    B1=[1,2,3] 
    C=[]. 

有人可以幫我修復我的代碼,並可以得到這樣的結果嗎?這對我來說非常重要,我真的需要幫助。 這是我做的,但有一些問題:

move(N,[H|T],[],[],A1,B1,C) :- 
     N > 1, 
     M is N - 1, 
     move(N,[H|M],[H|_],[],A1,B1,C), 
     move(M,[_|M],[H|_],[H|_],A1,B1,C), 
     move(M,[_|M],[],[H|T],A1,B1,C), 
     move(M,[],[_|T],[H|T],A1,B1,C), 
     move(M,[H|_],[_|T],[H|T],A1,B1,C), 
     move(M,[H|_],[_|T],[],A1,B1,C), 
     move(M,[],[H|T],[],A1,B1,C). 
     move(N,[H|T],[],[]) :- write(A1), nl, 
          write(B1), nl, 
          write(C). 

回答

4

這是解決問題河內的塔指令的指令。

move(1,X,Y,_) :- 
     write('Move top disk from '), 
     write(X), 
     write(' to '), 
     write(Y), 
     nl. 
    move(N,X,Y,Z) :- 
     N>1, 
     M is N-1, 
     move(M,X,Z,Y), 
     move(1,X,Y,_), 
     move(M,Z,Y,X). 

攻擊這樣的問題:在通過指令解決方案指令我們不改變X,Y或Z的內容,但在你的問題,你最終會改變他們的內容。

UPDATE: 因爲它被聲明,這不是一門功課的問題,以下是完整的答案:

towersOfHanoi(N,A,B,C,A4,B4,C4) :- move(N,A,B,C,A4,B4,C4),!. 

move(1,[H|T],B,C,A1,B1,C1) :- A1 = T, 
           B1 = [H|B], 
           C1 = C. 
move(N,A,B,C,A4,B4,C4) :- N>1, 
          M is N-1, 
          move(M,A,C,B,A1,C1,B1), 
          move(1,A1,B1,C1,A2,B2,C2), 
          move(M,C2,B2,A2,C4,B4,A4). 
+0

對不起,我標記錯了,這不是功課,是過去考試的一個問題。如果你能給我完整的答案,我會在下週參加考試。對不起, – user1400451

+0

@ user1400451更新爲完整答案 –

+0

我你可以用我的方式,但我不知道哪裏錯了,因爲我只是按照步驟編寫的代碼 – user1400451