2011-10-11 49 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