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