定义谓词summy(List, Limit, N),其中List是一个绝对值的数的列表,N是List列表中值小于Limit的数的和。
这就是我的结果:*
abx([],[]).
abx([H|T], [H|T1]):-
H >= 0,!,
abx(T,T1).
abx([M|T], [M1|T1]):-
M < 0,
M1 is M * (-1),
abx(T,T1).
summy([], [], []).
summy([H|T], L, N):-
abx([H|T], [X|Y]),
X < L,
sumlist([X|Y], N).
*如果我运行这个例子,它显示的是X=26,而不是X=11。
过滤部分是错误的。筛选部分是错误的。X < L
会检查 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).
那么摘要就是这样。
summy(Xs, L, R) :-
abx(Xs, As),
filterless(As, L, Bs),
sumlist(Bs, R).
然而我们可以利用 maplist/3
[swi-doc] 来做一个摸底,和 include/3
[swi-doc] 来过滤列表,所以我们可以重写一下 summy/3
到:
summy(Xs, L, R) :-
maplist(abs, Xs, As),
include(>(L), As, Bs),
sumlist(Bs, R).