2012-05-10 101 views
3

我在Prolog中思考困難。什麼是不正確對本聲明:瞭解Prolog中的列表和遞歸

numberList([], 0). 
numberList([H|T], Limit) :- 
    H is Limit, 
    numberList(T, Limit - 1). 

我想

?- numberList(X,Limit). 

確定[Limit, Limit-1 ... 1]作爲用於限制在給定值的唯一解決方案,即

?- numberList(X, 100). 

會產生X = [100, 99, 98, ..., 1].

我的猜測是,有一些漂亮的錯我的理解這裏這並不奏效。我不一定要求解決我所要做的事情,我只想了解爲什麼我的第一次嘗試是錯誤的。

+0

簡短回答:??A-1 = 0失敗。 '? - A-1是0.'也失敗了。 '? - length(X,5),X = [5 | _T],append(_T,[_],_ Z),maplist(succ,_Z,X).'做你想要的。 –

回答

3

有潛伏在這裏的兩個主要問題:

1 - 你的麻煩越來越統一和算術運算在正確的地方

2 - 你不檢查您輸入足夠的

備註使用大約1- (is)/2來執行算術運算,這裏例如將1減去Limit(is)/2可以但不應該用來將變量統一到已經計算過的算術表達式中。 (=)/2應該是首選(統一)。

約2備註即使你得到運營商的權利,你的program'd循環。稍後更多。

你不會獲得通過只是交換運營商了自己很多,所以這裏是正確的方法:

numberList([], 0). 
numberList([Limit|T], Limit) :- 
    NewLimit is Limit - 1, 
    numberList(T, NewLimit). 

在這裏你可以看到我用統一隱含在第二條的頭部,另一種方式把它如下:

numberList([], 0). 
numberList([H|T], Limit) :- 
    H = Limit, 
    NewLimit is Limit - 1, 
    numberList(T, NewLimit). 

但是現在,你可以通過嘗試這個節目出來看,它找到一個正確的解決方案,但如果你問一個又一個與;循環。

的原因可能是難以察覺的初學者的眼睛:在序言成功並返回一個解決方案,它只能找到探索的選擇點執行過程中留下新的。這裏,剩下的唯一選擇點是Limit0。因此,它會嘗試第二個子句,而不是第一個子句,然後循環,直到達到NegativeInfinity。可悲的是,由於這次旅行相當漫長,它之前就溢出了。解決此問題的方法是在第二個子句中添加一個警戒點,指定Limit應該大於0或者在第一個子句中添加一個切入點,或者甚至更好:執行這兩個操作。詢問你是否有麻煩自己做!

+0

這真的很有幫助,謝謝。 –

+0

如果您有麻煩,請不要猶豫,再次發佈問題!有時候,對於新手來說,Prolog可能會很艱難:p – m09

+2

嗯,我讀了幾個例子,他們好像說嘿,這是非常直觀的,你的母親可以這麼做......我幾乎不得不問她。 –

0

「限制 - 1」被認爲是一個函數調用,在C語言中,並因此它會工作。它要求/命令Prolog「找到一個減法函數,用極限變量和1來調用它」。它要求Prolog將「Limit - 1」理解爲函數調用結果,但Prolog將「Limit - 1」理解爲複合詞減法(Limit,1),它是來自一階邏輯的謂詞

「 H是限制「這也被認爲是函數調用

Prolog沒有函數(???),我認爲聲明是C人的一大障礙。 Prolog具有謂詞(如在謂詞邏輯,一階等等中),而不是函數(與C等一樣,與數學一樣)

函數是命令微處理器的命令。取而代之,謂詞向微處理器提供數據以「用微處理器的眼睛看」,向微處理器呈現數據以感知。

謂詞描述一個世界,描述該世界中物體之間的某些關係,微處理器試圖驗證這些關係。微處理器試圖證明這些關係真的存在於它的知識中。這些關係可以在其知識中多次存在,所以微處理器可以返回多個結果(即非確定性)

Prolog是一種奇妙的編程語言,可能我應該編寫出色的描述語言,奇妙的模式識別語言,奇妙的推理/推理語言(簡單的推理/推理,它不是一種「人工智能」,推理/推理如數字電子邏輯門)。我之前是一名熱衷Visual Studio的程序員,但我現在已經學習了幾年Prolog。

C語言等用於指令,Prolog語言等用於描述。