获取Prolog中的正值列表

时间:2019-02-26 02:40:03

标签: 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]).

如果我尝试getPos([1,-2,3], Result). 我得到的结果是事实2:

Call: getPos([], [3,1|_29])?
Exit: getPos([], [3,1|_29])?

此后,我退出了递归,最后只回答“是”。 我的两个问题是:
1.我应该怎么做,所以我的程序将在第二个事实处停止并仅返回L
的值 2.是否可以保持源清单的顺序? (我的版本反转了源列表)

1 个答案:

答案 0 :(得分:3)

您应该使用第三个参数 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).

如果值为0怎么办?

在SWI-Prolog中,您可以使用include/3

get_pos(In, Out) :-
    include(>( 0), In, Out).

如果您只想使用2个参数,则可以编写

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