我正在处理一个包含子列表的列表,每个子列表有 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)。我不关心总和的字符串,所以它是_
.
Nothing wrong with @mbratch's code (+1), but I would do it tail-recursively (and cut-free) like so:
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).