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

如何在Prolog中汇总多个列表?,prolog,Prolog,我正在编写一个prolog程序,但我不知道如何完成这个程序。这是要求 程序允许多个事实,但是,每个事实中的列表长度必须等于 例1 %fact f(first, [1, 6, 10]). f(second, [7, 3, 8]). f(third, [5, 9, 5]). ?-sum_list([first,second,third], Even, Result). Even = 1 Result = [13,18,23] 例2 %fact f(first, [1,6,10]). f(seco

我正在编写一个prolog程序,但我不知道如何完成这个程序。这是要求

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

例1

%fact
f(first, [1, 6, 10]).
f(second, [7, 3, 8]).
f(third, [5, 9, 5]).
?-sum_list([first,second,third], Even, Result).
Even = 1
Result = [13,18,23]
例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]).
?-sum_list([first,second,third,fourth,fifth], Even, Result).
Even = 2
Result = [27,28,34]
例3

%fact
f(first, [1,6,10,54,11,6]).
f(second, [7,3,8,34,2,7]).
?-sum_list([first,second], Even, Result).
Even = 3
Result = [8,9,18,88,13,13]
现在,我需要编写一个谓词sum_list(),以便用户可以执行以下操作

例1

%fact
f(first, [1, 6, 10]).
f(second, [7, 3, 8]).
f(third, [5, 9, 5]).
?-sum_list([first,second,third], Even, Result).
Even = 1
Result = [13,18,23]
例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]).
?-sum_list([first,second,third,fourth,fifth], Even, Result).
Even = 2
Result = [27,28,34]
例3

%fact
f(first, [1,6,10,54,11,6]).
f(second, [7,3,8,34,2,7]).
?-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

尝试以下方法:

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.

你尝试过什么吗?你能展示一下到目前为止你都做了些什么吗?事实上我是一个prolog初学者,有很多prolog的东西我都不知道。我有一个在java上实现这个程序的想法,但是我知道java和prolog之间有很大的区别(例如我不能在prolog中使用返回值),这让我不知道如何开始。我想你误解了这个问题。在示例1中,结果是[13,18,23],即[(1+7+5),(6+3+9),(10+8+5)]{垂直求和}。然而,你的回答仍然给了我一个解决这个问题的提示,所以非常感谢。