Prolog和值数小于极限

Prolog和值数小于极限,prolog,Prolog,定义谓词summy(List,Limit,N),其中List是绝对值数字的列表,N是值小于Limit的列表中这些数字的总和 这就是我所拥有的: * abx([],[])。 abx([H|T],[H|T1]):- H>=0,!, abx(T,T1)。 abx([M|T],[M1|T1]):- M

定义谓词summy(List,Limit,N),其中List是绝对值数字的列表,N是值小于Limit的列表中这些数字的总和

这就是我所拥有的: *

abx([],[])。 abx([H|T],[H|T1]):- H>=0,!, abx(T,T1)。 abx([M|T],[M1|T1]):- M<0, M1是M*(-1), abx(T,T1)。 总和([]、[]、[])。 总和([H | T],L,N):- abx([H|T],[X|Y]), X

如果我运行这个示例,它会显示X=26,而不是X=11。

过滤部分是错误的。
X
将检查列表的第一个元素是否小于
L
。如果是,它将计算所有绝对值的总和,如果不是,整个谓词将失败

因此,您应该进行过滤,例如:

filterless([], L, []).
filterless([H|T], L, [H|T2]) :-
    H < L,
    filterless(T, L, T2).
filterless([H|T], L, T2) :-
    H > L,
    filterless(T, L, T2).

你尝试了什么,什么不起作用?我有一个问题,XX,它将对整个列表求和。否则,谓词将失败。哇,我不知道maplist/3和include/3。非常感谢你,你是天才。
filterless([], L, []).
filterless([H|T], L, [H|T2]) :-
    H < L,
    filterless(T, L, T2).
filterless([H|T], L, T2) :-
    H > L,
    filterless(T, L, T2).
summy(Xs, L, R) :-
    abx(Xs, As),
    filterless(As, L, Bs),
    sumlist(Bs, R).
summy(Xs, L, R) :-
    maplist(abs, Xs, As),
    include(>(L), As, Bs),
    sumlist(Bs, R).