在列表中添加小于给定数字的数字

addition of numbers, in a list, that are smaller than a given number

我正在学习序言,我必须创建一个程序,returns 添加小于给定数字的数字(在列表中)。 我有这个..

additionsmaller([X|XS],K,R):-X>K, additionsmaller(XS,K,R).
additionsmaller([X|XS],K,R):-X<K, additionsmaller(XS,K,T), R is T + X.
additionsmaller([X],K,X):-X<K.
additionsmaller([X],K,0):-K<X.

我希望例如:

additionsmaller([1,2,3,4,2],4,R).
R=8

但它给了我错误。

我正在使用这个https://swish.swi-prolog.org

我该怎么做才能解决这个问题?我的代码有什么问题?

问题在于,对于值 V,您只处理 X<VX>V 的情况,而不处理 X=V 的情况。事实上,如果将 X>K 替换为 X>=K,您的程序将给出结果 R=8.

关于你的程序我说两点:

首先,您不需要代码中的最后两行(即 additionsmaller([X],K,X):-X<K.additionsmaller([X],K,0):-K<X.)。只需将这两行替换为 additionsmaller([],_,0).

其次:您还应该考虑编写一个尾递归解决方案,如下所示:

additionSmallerTail([],_,V,V).
additionSmallerTail([H|T],K,V,V0):-
    H >= K,
    additionSmallerTail(T,K,V,V0).
additionSmallerTail([H|T],K,V,V0):-
    H < K,
    V1 is V+H, 
    additionSmallerTail(T,K,V1,V0).

?- additionSmallerTail([1,2,3,4,2],4,0,R).
R = 8
false

为什么要使用尾递归? This link 很有趣。