因此,我试图从给定列表中获取肯定元素的列表。到目前为止,我已经解决了这个问题:
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.是否可以保持源清单的顺序? (我的版本反转了源列表)
答案 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).