我写了一个小的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;迹象。
答案 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): -