我的工作,包含与各2个元素的子列表名单上。 每个子表的第一个元素是一个字符串,而第二个数字。
[ [e, 30], [a, 170], [k, 15], [e, 50] ]
我要添加的每个子列表的所有号码。 我想这一个:
sum_fire([H|T],S):-
flatten(H,L),
sum_fire(T,S),
L=[_H1|T1],
sum(T1,S).
但它是完全错误的,我想。 我怎样才能得到这个工作?
我的工作,包含与各2个元素的子列表名单上。 每个子表的第一个元素是一个字符串,而第二个数字。
[ [e, 30], [a, 170], [k, 15], [e, 50] ]
我要添加的每个子列表的所有号码。 我想这一个:
sum_fire([H|T],S):-
flatten(H,L),
sum_fire(T,S),
L=[_H1|T1],
sum(T1,S).
但它是完全错误的,我想。 我怎样才能得到这个工作?
你只需要打出来的字符串与数量:
sum_fire( [[_,N]|Tail], Sum ) :-
sum_fire( Tail, S1 ),
Sum is N + S1.
sum_fire( [], 0 ).
所以我使用[_,N]
而不是H表示头项目,因为我想里面有什么(数量N)。 我不关心字符串的总和,所以它的_
。
没有错@ mbratch的代码(+1),但我会做尾递归(和非切割),如下所示:
sum_fire(L, Sum) :- sum_fire(L, 0, Sum).
sum_fire([[_,N]|T], Acc, Sum) :-
Acc1 is N + Acc,
sum_fire(T, Acc1, Sum).
sum_fire([], Sum, Sum).
SWI-Prolog有库( 合计为):
sum_fire(L, S) :-
aggregate_all(sum(X), member([_,X], L), S).
另一种方式来获得完成任务,利用图书馆( 申请 )和库( 列表 ):
?- maplist(nth1(2), [ [e, 30], [a, 170], [k, 15], [e, 50] ], L), sum_list(L, S).
L = [30, 170, 15, 50],
S = 265.