定义谓词伪装(List,Limit,N),其中List是绝对值数字的列表,而N是值小于Limit的List列表中此类数字的总和。
这是我所拥有的:*
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]进行映射,并使用maplist/3
过滤列表,因此我们可以将include/3
[swi-doc]重写为:
include/3