我想在不切割的情况下清除列表。我试过了:
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
这是一种方法:
filter([ ],[ ]).
filter([H|T],X) :-
( H > 0 -> X = Y ; X = [H|Y] ),
filter(T,Y).
因为 Prolog 中的 if-then-else 结构有时被描述为具有“隐藏剪切”,这意味着 Prolog 不会重试(回溯)此结构的“if”部分中的逻辑结果(它提交到第一个也是唯一一个结果),可以想象你的课程讲师可能会反对这个解决方案(即使没有使用实际的剪辑)。
但是您的解决方案部分错误。您将零元素与积极元素混为一谈,您的问题的措辞表明只有积极的条目需要从列表中“清除”。