2011-10-11 53 views
1

由於某種原因,這不起作用。我越來越: 錯誤:是/ 2:論點是沒有充分實例化在列表中添加整數

1 add_list([]). 
2 add_list([H|T]):- 
3     Sum2 is Sum1 + H, 
4     add_list(T). 

我想添加一個列表(僅包含數字)的內容。

回答

3

我不確定你在做什麼。但是,如果你正在嘗試calc下總和會是這個樣子(更名爲list_sum作爲add_list沒有任何意義):

list_sum([], 0). 
list_sum([H|T], Sum):- 
    list_sum(T, SubSum), 
    Sum is SubSum + H. 
+0

謝謝,這是我一直想把你了。但我認爲我對序言中的遞歸有點困惑。 list_sum([],0)。這是基本情況嗎?並且因爲列表中沒有剩餘元素而實現了0? –

+0

拳頭線是「事實」。第二行是「規則」。你必須達到規則的事實。我知道這有點奇怪,但你應該閱讀更多的序言(例如http://en.wikipedia.org/wiki/Prolog) –

0

另外,您也可以使用蓄能器(優點是,它是尾遞歸,因此可以優化)

list_sum(L,R) :- list_sum(L,0,R). 
list_sum([],A,A). 
list_sum([H|T],A,R) :- A1 is A + H, list_sum(T,A1,R). 
1

你可以有一個「functionnal記」與與foldl:

foldl(_P, [], V, V). 

foldl(P, [H|T], V1, VF) :- 
    call(P, H, V1, V2), 
    foldl(P, T, V2, VF). 


sum_list(L, S) :- 
    foldl(add, L, 0, S). 


add(X, Y, Z) :- 
    Z is X+Y. 
+0

s(X)以獲得更高的順序! – repeat