我定义了一个目标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).

10-06 15:35