如何在Prolog中总结多个列表?

时间:2015-11-08 07:10:23

标签: prolog

我正在制作一个prolog程序,但我不知道完成该程序。这是要求。

该程序允许多个事实,但是,每个事实中的列表长度必须等于

示例1

%fact
f(first, [1, 6, 10]).
f(second, [7, 3, 8]).
f(third, [5, 9, 5]).

示例2

%fact
f(first, [1,6,10]).
f(second, [7,3,8]).
f(third, [5,9,5]).
f(fourth, [7,3,9]).
f(fifth, [7,7,2]).

示例3

%fact
f(first, [1,6,10,54,11,6]).
f(second, [7,3,8,34,2,7]).

现在,我需要编写谓词 sum_list(),以便用户可以执行以下操作。

示例1

?-sum_list([first,second,third], Even, Result).
Even = 1
Result = [13,18,23]

示例2

?-sum_list([first,second,third,fourth,fifth], Even, Result).
Even = 2
Result = [27,28,34]

示例3

?-sum_list([first,second], Even, Result).
Even = 3
Result = [8,9,18,88,13,13]

结果是一个列表,其中包含相应事实列表中每个元素的总和。

偶数计算结果中偶数的数量,在例2中,只有28和34是偶数,所以偶数= 2.

感谢。

感谢SimoV8的提示,我得到了一些想法解决的方法:

%fact
f(first, [1, 6, 10]).
f(second, [7, 3, 8]).

sum_list([Head|Tail], E, R) :- 
    f(Head, P),
    sw(P, Tail, [R]),
    even(E,R).

sw(H1, [Head|Tail], [X|R]) :-
    f(Head,S),
    sum(H1, S, X),
    sw(X, Tail, R).

sw(_, [], []).

sum([H1|T1],[H2|T2],[X|L3]) :- 
    sum(T1,T2,L3), X is H1+H2.

sum([],[],[]).

even(E, [X|R]) :-
    even(E2, R),
    ((X mod 2) =:= 1 -> E is E2; E is E2 + 1).

even(0, []).

但是,答案只接受两个f(),如果超过两个f(),则会返回 FALSE

1 个答案:

答案 0 :(得分:0)

试试这个:

sum_list([], 0, []).
sum_list([H|T], E, [RH|RT]):- f(H, X), 
                              sum(X, RH), 
                              sum_list(T, E2, RT), 
                              ((RH mod 2) =:= 1 -> E is E2; E is E2 + 1).
 sum([], 0).
 sum([H|T], S1):- sum(T, S2), S1 is H + S2.