我正在制作一个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
答案 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.