Prolog Clear不使用削减的正面元素列表

时间:2013-04-14 16:42:33

标签: list prolog

我想清除一个没有剪切的列表。我试过了:

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

1 个答案:

答案 0 :(得分:0)

这是一种方法:

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

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

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