2015-09-05 104 views
1

與標題狀態一樣,我試圖從子謂詞返回返回值的總和,但它不起作用。這裏是我的代碼:序言謂詞求和不起作用

addlistnum([],[],X). 
addlistnum(digits(Y,[A|T]),digits(F,[B|T]),X) :- 
    X is Y + F. 

digits(Num, List) :- 
    digits(0, List, Num). 

digits(Num, [], Num). 
digits(N, [A|As], Num) :- 
    N1 is N * 10 + A, 
    digits(N1, As, Num). 

子謂詞工作正常。它將列表轉換爲整數。現在我想總結轉換後的值。 例子:

?- digits(X,[3,3,3]). 
X = 333.    % works as expected 

大廈上,addlistnum([3,3,3,3],[2,2,2],X)應該產生X = 3555(如3555 is 3333 + 222),但我得到false代替。

我也試過:

addlistnum([],[],X). 
addlistnum([A|T],[B|T],X) :- 
    X is Y + F, 
    digits(Y,[A|T]), 
    digits(F,[B|T]). 

它只是簡單地返回false,它沒有給出有關是錯誤的信息。

+1

這裏存在根本的誤解。你的謂詞子句頭:'addlistnum(digits(Y,[A | T]),digits(F,[B | T]),X)'似乎暗示你將'digits'想象成一個返回值的函數,但它不會那樣工作。當你調用addlistnum([3,3,3,3],[2,2,2],X)'時,Prolog試圖將術語'[3,3,3,3]'與術語相匹配, '[]'或'數字(Y,[A | T])'並且失敗,因爲它們顯然不匹配。 – lurker

回答

3

問題是在這些規則:

addlistnum([],[],X). 
addlistnum(digits(Y,[A|T]),digits(F,[B|T]),X) :- 
    X is Y + F. 

第二個是「另外的兩個列表是增加了這些列表的整數轉換」:

addlistnum(A,B,X) :- 
    digits(NA,A), 
    digits(NB,B), 
    X is NA + NB. 

第一個是沒有必要,空列表的「數字」爲零,因此,該規則還涵蓋「添加兩個空列表爲零」