2010-02-03 22 views
2

我在寫一個謂詞來添加兩個向量。這是我想出了:序言中的向量添加

add([], [], 0). 
add([A], 0, A). 
add([A], [B], C) :- C is A + B. 
add(A, B, C) :- add(B, A, C). 
add([H1|T1], [H2|T2], WYNIK) :- X is H1 + H2, add(T1, T2, Y), append([X], Y, WYNIK). 

前四行工作得很好,但我不能讓最後一個工作 - 我該怎麼辦錯了嗎?

回答

3

按照此順序,最後一行將永遠不會被運行。行:

add(A, B, C) :- add(B, A, C). 

將與尚未通過它上面的規則處理什麼統一。

1

傑夫觀察,問題是規則:

 
add(A, B, C) :- add(B, A, C). 

在一般情況下,這是表示你想成爲真正的東西的規則,但是,這並不能幫你解決的目標。此規則查詢add(1,2,X)導致子查詢add(2,1,X),從而導致子查詢add(1,2,X):SLD resoltuion可以永遠花這個分支(如果它具有更高的優先級沒有其他規則,它不會發現該規則不取得進展)而沒有得到任何地方您只應在有條件的情況下(例如strictlylessthan (B,A))使用此規則,以確保該規則僅適用於可以執行有用工作的規則。這些規則的問題是Prolog不是真正的聲明性語言的原因。

要重新交換性,你需要添加RUL:

 
add (0, [A], A). 

外接謂語是種奇怪:add([1],0,1)是真實的,因爲是add([1],[0],1),但add([0],1,1)是不是,也不是add([1],[0],[1])。從計算的角度來看,add是非常有意義的,但它真的是你想要的嗎?