我编写了一个小的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.知道这是为什么吗?除了一些化妆品的变化外,我只更换了<和>符号。
发布于 2014-06-02 19:34:42
第二个子句不正确,因为它的第二个参数是[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)
.发布于 2014-06-01 23:56:32
提示:因为您在[]中有一个单例变量(被认为是一个列表)。
答:在第2款的前面应该是
Rem_over(X=Xs,Ys) :-
https://stackoverflow.com/questions/23963344
复制相似问题