Prolog - 为什么变量不受约束?

Fro*_*koy 2 list prolog

我已经定义了一个目标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).
Run Code Online (Sandbox Code Playgroud)

我打电话的时候

lowerpartition([1,2,3,4,5],3,X).
Run Code Online (Sandbox Code Playgroud)

我希望X绑定到列表[3,2,1],但Prolog只返回false.我做错了什么?

gus*_*bro 5

您似乎正在将基于累加器的方法与基于堆栈的方法混合使用.你的第一个条款:

lowerpartition(X,P,Z) :- var(Z),!,lowerpartition(X,P,[]).
Run Code Online (Sandbox Code Playgroud)

将保留未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).
Run Code Online (Sandbox Code Playgroud)