我定义了一个目标lowerpartition / 3,如下所示:
lowerpartition(X,P,Z) :- var(Z),!,lowerpartition(X,P,[]).
lowerpartition([],_,_).
lowerpartition([X|Xs],P,Z) :- X=<P, lowerpartition(Xs,P,[X|Z]).
lowerpartition([X|Xs],P,Z) :- X>P, lowerpartition(Xs,P,Z).
当我打电话
lowerpartition([1,2,3,4,5],3,X).
我希望X绑定(bind)到列表[3,2,1],但是Prolog仅返回false。我做错了什么?
最佳答案
看来您正在将基于累加器的方法与基于堆栈的方法混合在一起。
您的第一个子句:
lowerpartition(X,P,Z) :- var(Z),!,lowerpartition(X,P,[]).
将会使
Z
未被实例化,在检查它是否是变量之前不会被使用,因此不会被使用...尝试这个:
lowerpartition([], _, []).
lowerpartition([X|Xs], P, [X|Zs]):-
X =< P, lowerpartition(Xs, P, Zs).
lowerpartition([X|Xs], P, Zs):-
X > P, lowerpartition(Xs, P, Zs).