2014-10-17 111 views
0

我正試圖編寫一個程序來解決Prolog河內問題的塔。這裏沒有任何帖子幫助我,所以我決定要求自己。我寫了下面的代碼。它可以很好地用於2個磁盤,而是進入一個無限循環的3Prolog - 河內塔

hanoi(1,A,B,_,[(A,B)]). 
hanoi(X,A,B,C,Y):- 
    hanoi(X2,A,C,B,Y1), 
    hanoi(1,A,B,_,[Y2]), 
    hanoi(X2,C,B,A,Y3), 
    append(Y1,[Y2|Y3],Y), 
    X2 is X-1. 

這就是所謂的通過以下方式:

?- hanoi(3, a, b, c, Y). 

A,B,C是釘。 3是磁盤的數量,X是我們想要的結果。

我需要在Y中得到結果我試圖遞歸地找到X-1光盤從掛鉤1到3使用2,1光盤從掛鉤1到2,X-1光盤從掛鉤3到2並追加它們。我無法理解我做錯了什麼。任何幫助或指導,將不勝感激!謝謝!

+3

這些參數意味着什麼?哪些必須被實例化爲什麼類型的術語?或者:向我們展示你如何稱謂這個謂詞。 – 2014-10-17 07:13:54

回答

2

明顯的問題 -

當你有一個結合,如:

a, b, c 

你有這兩個讀數,邏輯和程序。邏輯讀數應該是:

「如果a爲true,並且b爲true,並且c爲真,則連接爲真。」

的程序化的解讀是:

「如果a被評爲結合會成功,成功,然後b進行評估,同時也成功,然後c進行評估,同時也成功的。」 (或者換句話說,先執行深度優先搜索解決方案空間)

如果您足夠小心,程序性閱讀並不需要爭論您的代碼。然而,只有當連詞中的所有子目標都有邏輯和程序閱讀的完全重疊時纔是這種情況。

這裏的罪犯是is/2。它不具有純粹的邏輯意義。它評估右手操作數(算術表達式)並將結果與​​左手(通常是未綁定的變量)相結合。

在這裏,您有一個連接(在第二個子句的正文中),實際上是「評估a(X),然後如果成功,則找到X的值」。顯而易見的問題是a(X)要求X的值以終止的方式進行評估。

因此,請在使用其結果的所有子目標之前移動is,或者使用約束來查找。

+0

非常感謝!你的解釋是非常有幫助的。 – usb 2014-10-17 07:44:22