List 获取Prolog中的正值列表

List 获取Prolog中的正值列表,list,recursion,prolog,List,Recursion,Prolog,所以我试着从给定的列表中得到一些积极的元素。到目前为止,我已经找到了这个解决方案: 1 getPos([],[]). 2 getPos([], L). 3 getPos([Head|Tail], L):- 4 Head<0, getPos(Tail,L). 5 getPos([Head|Tail], L:- 6 Head>0, getPos(Tail, [Head|L]). 在那之后,我退出递归,只得到“是”的答案。 我的两个问题是: 1.我应该怎么做,这样我的程序就会停止

所以我试着从给定的列表中得到一些积极的元素。到目前为止,我已经找到了这个解决方案:

1 getPos([],[]).
2 getPos([], L).
3 getPos([Head|Tail], L):-
4   Head<0, getPos(Tail,L).
5 getPos([Head|Tail], L:-
6   Head>0, getPos(Tail, [Head|L]).
在那之后,我退出递归,只得到“是”的答案。 我的两个问题是:
1.我应该怎么做,这样我的程序就会停止在第二个事实上,只返回L的值

2.是否可以保持源列表的顺序?(我的版本反转源列表)

您应该使用第三个参数getPos(In、CurOut、Out),当In为空时(例如,[]),您可以将CurOut与Out统一起来。 所以你得到了

getPos(In, Out) :-
    getPos(In, [], Out).
getPos([],L, L).
% getPos_1([], L).
getPos([Head|Tail], CurL, L):-
   Head<0, getPos(Tail,CurL, L).
getPos([Head|Tail], CurL, L):-
   Head>0, getPos(Tail, [Head|CurL], L).
如果只想使用2个参数,可以编写

getPos1([], []).
getPos1([Head|Tail], L):-
   Head<0, getPos1(Tail,L).
getPos1([Head|Tail], [Head|L]):-
   Head>0, 
   getPos1(Tail, L).
getPos1([],[])。
getPos1([Head | Tail],L):-
头0,
getPos1(尾部,L)。

非常感谢,最后一部分工作得很好!
get_pos(In, Out) :-
    include(>( 0), In, Out).
getPos1([], []).
getPos1([Head|Tail], L):-
   Head<0, getPos1(Tail,L).
getPos1([Head|Tail], [Head|L]):-
   Head>0, 
   getPos1(Tail, L).