从列表中删除特定值上方/下方的元素

时间:2014-05-30 20:59:20

标签: prolog

我写了一个小的Prolog脚本,它取一个列表,删除低于阈值N的所有值:

rem_under([], []).
rem_under([X|Xs], [X|Ys]) :-
    X >= 10,
    rem_under(Xs, Ys).
rem_under([X|Xs], Ys) :-
    X < 10,
    rem_under(Xs, Ys).

所以,例如:

2 ?- rem_under([2,15,16,3,5,19],L).
L = [15, 16, 19] 

然后我想制作一个类似的功能,删除所有元素超过阈值N:

rem_over([], []).    
rem_over([X|Xs], [Ys]) :-
    X > 10,
    rem_over(Xs, Ys).
rem_over([X|Xs], [X|Ys]) :-
    X <= 10,
    rem_over(Xs, Ys).
然而,

返回:

1 ?- rem_over([2,15,17,6],L).
false.

知道为什么会这样吗?除了一些外观变化,我只换了&lt;和&gt;迹象。

2 个答案:

答案 0 :(得分:1)

你的第二个条款不正确,因为它的第二个参数是[Ys] - 长度为1的列表:

rem_over( [X|Xs] , [Ys] ) :-
X > 10,
rem_over(Xs, Ys).

一旦确定源列表的头部大于10,就可以在源列表的尾部和结果列表的内容上进行递归。

试试这个:

rem_over( []     , [] ) .      % source list exhausted? success!
rem_over( [X|Xs] , Ys ) :-     % source list non-empty?
  X > 10,                      % - head greater than the threshold?
  rem_over(Xs, Ys)             % - chuck it and recurse down on the remainder of the source list
  .                            %
rem_over( [X|Xs] , [X|Ys] ) :- % source list non-empty? add the head to the result
  X =< 10,                     % - IF it's less than or equal to the threshold
rem_over(Xs, Ys).              % - then recurse down on the remainder

到达那里的另一种方式:

rem_over( []     , [] ) .
rem_over( [X|Xs] , Ys ) :-
  ( X > 10 -> Y1 = Ys ; Y1 = [X|Ys] ) ,
  rem_over(Xs,Y1)
  .

答案 1 :(得分:0)

提示:因为你在[]中有一个单例变量(被认为是一个列表)。

答案:在第2条的头部应该是

  

rem_over([X | Xs],Ys): -