List 如何使用prolog删除列表中的非数字

List 如何使用prolog删除列表中的非数字,list,filter,prolog,List,Filter,Prolog,我应该删除列表中所有不大于数字的元素。我可以用数字来解。但是当列表有一些符号时,我应该如何删除。这是我的代码 greater_nrs_only( X, List, Ans) :- greater_nrs_only( X, List, Ans, [] ), !. greater_nrs_only( _, [], Ans, Ans). greater_nrs_only( X, [H | Tail], Ans, Acc ) :- ( ( H < X, NewEl

我应该删除列表中所有不大于数字的元素。我可以用数字来解。但是当列表有一些符号时,我应该如何删除。这是我的代码

greater_nrs_only( X, List, Ans) :-
    greater_nrs_only( X, List, Ans, [] ), !.

greater_nrs_only( _, [], Ans, Ans).
greater_nrs_only( X, [H | Tail], Ans, Acc ) :-
    (
        ( H < X, NewEl = [] )
        ;
        ( H >= X, NewEl = [H] )
    ),
    append( Acc, NewEl, NewAcc ),
    greater_nrs_only( X, Tail, Ans, NewAcc).
仅限更大的(X、列表、Ans):-
仅限更大的(X,列表,Ans,[])!。
仅限更大的数值(u,[],Ans,Ans)。
仅限更大的nrs(X、[H |尾]、Ans、Acc):-
(
(H=X,NewEl=[H])
),
附加(Acc、NewEl、NewAcc),
仅限更大尺寸(X、尾部、Ans、NewAcc)。
和?-仅限更大的数值(6,[],X)。
为false

此错误的原因是
H
本身不是一个数字,因此将
6
a
进行比较将产生错误。您可以使用来检查某物是否为数字

您还可以使用,而不是手动进行筛选,它会筛选满足给定谓词的项的列表:

greater_than(X, Y) :-
    number(Y),
    X < Y.

greater_nrs_only(X, L, R) :-
    include(greater_than(X), L, R).
大于(X,Y):-
编号(Y),
Xinclude(大于(X),L,R)。
如果我在本地运行它,我会得到
X=[]
。但是当我只使用更大的(6,[3,a,b,-1],X)运行时,只是错误是的,因为
6
,错误,因为比较这些错误是不明智的。您可以用
number(H)
检查它是否是一个数字。谢谢!它可以工作,但我应该更改X。@zhangrui:你可能是说
=是的,但我解决了它,实际上我应该使用X