如何在Prolog中编写一个过程来清除其负面元素的整数列表并将结果返回到新列表中?不使用削减但可以使用否定。
例如:
?- filter([1,0,-6,7,-1],L).
L = [1,0,7];
no
答案 0 :(得分:2)
你几乎是对的。 你的解决方案是:
filter([],[]).
filter([H|T],S) :-
H<0,
filter(T,S).
filter([H|T],S) :-
H>=0,
filter(T,[H|S]).
基本情况和项目为负的情况是正确的。 问题出在最后一个案例中。检查项目是否为非负数后,您就会知道该项目将位于结果列表中。因此,您应该执行递归并返回一个列表,其中包含您已检查的元素(H)和递归返回的列表。因此,最后一个条款应该是
filter([H|T],[H|S]) :-
H>=0,
filter(T,S).
答案 1 :(得分:1)
在SWI-Prolog中,您可以使用exclude/3
?- exclude(negative, [-1, -0.5, 0, 0.5, 1], L).
L = [0, 0.5, 1].
如果您有negative/1
的定义:
negative(Number) :-
Number < 0.
答案 2 :(得分:0)
对最后一种情况使用递归
我写道:
filter([],[]).
filter([H|T],S) :-
H<0,
filter(T,S).
filter([H|T], L) :-
H>=0,
filter(T, S),
append([H],S,L).