Prolog 序言-总结;定位;列表中的元素

Prolog 序言-总结;定位;列表中的元素,prolog,Prolog,我正在寻找以下问题的解决方案:“编写一个Prolog程序来总结给定列表中的所有奇数。” 示例查询: ?- odd([1,2,3,4,5],Sum). Sum = 9. % correct as 1+3+5 equals 9 这看起来像是家庭作业,所以我会给你一个正确的方向。问题实际上是两个独立的问题:过滤和求和。分别解决这些问题,并通过组合解决方案实现奇数。奇数定位元素的总和可通过以下方式找到:;其中列表从0索引: odd_sum_nth0([_,X|Y],

我正在寻找以下问题的解决方案:“编写一个Prolog程序来总结给定列表中的所有奇数。”

示例查询:

?- odd([1,2,3,4,5],Sum).
Sum = 9.                   % correct as 1+3+5 equals 9

这看起来像是家庭作业,所以我会给你一个正确的方向。问题实际上是两个独立的问题:过滤和求和。分别解决这些问题,并通过组合解决方案实现奇数。

奇数定位元素的总和可通过以下方式找到:;其中列表从0索引:

odd_sum_nth0([_,X|Y], Sum) :-
    odd_sum_aux(Y, X, Sum).
否则,列表将从1索引:

odd_sum_nth1([X|Y], Sum) :-
    odd_sum_aux(Y, X, Sum).
鉴于:

odd_sum_aux([_, W|X], Y, Sum) :-
    !, Z is W + Y,
    odd_sum_aux(X, Z, Sum).
odd_sum_aux(_, Sum, Sum).
买主注意事项。;-)

直接实施:

odd([],0).
odd([X|Xs],S) :- even(Xs,S0), S is S0+X.

even([],0).
even([_|Xs],S) :- odd(Xs,S).
示例查询:

?- odd([],S).
S = 0.

?- odd([1],S).
S = 1.
?- odd([1,_],S).
S = 1.

?- odd([1,_,3],S).
S = 4.
?- odd([1,_,3,_],S).
S = 4.

?- odd([1,_,3,_,5],S).
S = 9.

@错。给你。我希望您喜欢.Nor,Nor。使用cut时,此解决方案会为实例化不足的部分列表生成干净的错误。?!?我不明白你的意思。我发现你的留言(同时被删除了),你直接跟我说我会投你否决票。