如何使用2个元素从子列表中添加元素(第一个元素是字符串,第二个元素是数字)?

时间:2013-06-08 17:44:02

标签: prolog

我正在处理一个列表,其中包含每个包含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).

但我认为这是完全错误的。我怎样才能让它发挥作用?

3 个答案:

答案 0 :(得分:2)

你只需要打破字符串与数字:

sum_fire( [[_,N]|Tail], Sum ) :-
    sum_fire( Tail, S1 ),
    Sum is N + S1.
sum_fire( [], 0 ).

所以我使用[_,N]代替H代表头项,因为我想要内部的东西(数字N)。我不关心总和的字符串,所以它是_

答案 1 :(得分:1)

@ 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).

答案 2 :(得分:0)

SWI-Prolog拥有库(aggregate):

sum_fire(L, S) :-
  aggregate_all(sum(X), member([_,X], L), S).

使用库(apply)和库(lists)完成任务的另一种方法:

?- maplist(nth1(2), [ [e, 30], [a, 170], [k, 15], [e, 50] ], L), sum_list(L, S).
L = [30, 170, 15, 50],
S = 265.