首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从上面/下面的列表中删除元素

从上面/下面的列表中删除元素
EN

Stack Overflow用户
提问于 2014-05-30 20:59:20
回答 2查看 270关注 0票数 0

我编写了一个小的Prolog脚本,其中包含了一个列表,删除了低于阈值N的所有值:

代码语言:javascript
复制
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).

因此,例如:

代码语言:javascript
复制
2 ?- rem_under([2,15,16,3,5,19],L).
L = [15, 16, 19] 

然后,我想做一个类似的函数,删除高于阈值N的所有元素:

代码语言:javascript
复制
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).

但返回:

代码语言:javascript
复制
1 ?- rem_over([2,15,17,6],L).
false.

知道这是为什么吗?除了一些化妆品的变化外,我只更换了<和>符号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-02 19:34:42

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

代码语言:javascript
复制
rem_over( [X|Xs] , [Ys] ) :-
X > 10,
rem_over(Xs, Ys).

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

试试这个:

代码语言:javascript
复制
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

另一种到达那里的方法:

代码语言:javascript
复制
rem_over( []     , [] ) .
rem_over( [X|Xs] , Ys ) :-
  ( X > 10 -> Y1 = Ys ; Y1 = [X|Ys] ) ,
  rem_over(Xs,Y1)
  .
票数 1
EN

Stack Overflow用户

发布于 2014-06-01 23:56:32

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

答:在第2款的前面应该是

Rem_over(X=Xs,Ys) :-

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23963344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档