0

我想在不切割的情况下清除列表。我试过了:

filter([],[]).

filter([H|T],[H|S]) :- 
   H<0,
   filter(T,S).

filter([H|T],S) :- 
   H>=0,
   filter(T,S).

但它不起作用。

这是我尝试时发生的事情:

?- filter([1,0,-6,7,-1],L).

L = [-6,-1]; %false
no

L=[0,-6,-1] %true
4

1 回答 1

0

这是一种方法:

filter([ ],[ ]).
filter([H|T],X) :-
    ( H > 0 -> X = Y ; X = [H|Y] ),
    filter(T,Y).

因为 Prolog 中的 if-then-else 结构有时被描述为具有“隐藏剪切”,这意味着 Prolog 不会重试(回溯)此结构的“if”部分中的逻辑结果(它提交到第一个也是唯一一个结果),可以想象你的课程讲师可能会反对这个解决方案(即使没有使用实际的剪辑)。

但是您的解决方案部分错误。您将零元素与积极元素混为一谈,您的问题的措辞表明只有积极的条目需要从列表中“清除”。

于 2013-04-14T21:37:17.123 回答