2

我定义了一个目标 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 绑定到列表 [3,2,1],但 Prolog 只返回 false。我做错了什么?

4

3 回答 3

5

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

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).
于 2012-12-26T15:24:43.460 回答
3

因为您在第一个子句中使用了 prolog 无法统一的谓词。

lowerpartition(X,P,Z) :- var(Z),
                         !,
                         lowerpartition(X,P,[]). % here is what prolog cant unify 

对代码稍作修改:

lowerpartition(X,P,Z) :- var(Z),lowerpartition_1(X,P,Z),!. % note the position of cut aswell

lowerpartition_1([],_,[]).
lowerpartition_1([X|Xs],P,[X|Z]) :- X=<P, lowerpartition_1(Xs,P,Z).
lowerpartition_1([X|Xs],P,Z) :- X>P, lowerpartition_1(Xs,P,Z).

希望这可以帮助。

于 2012-12-26T15:23:31.167 回答
2

这是一个基于 DCG 的解决方案:我的简单测试返回与 gusbro 解决方案相同的结果。

lowerpartition(P), [X] --> [X], {X=<P}, lowerpartition(P), !.
lowerpartition(P) --> [X], {X>P}, lowerpartition(P).
lowerpartition(_) --> [].

这是如何调用它:

?- phrase(lowerpartition(3), [1,2,3,4,5,3,2,6,7], X).
X = [1, 2, 3, 3, 2].

但是如果你使用的是带有 lìbrary( apply ) 的 Prolog,那么

lowerpartition(Xs, P, Rs) :- exclude(compare(<, P), Xs, Rs).

返回与上面相同的结果

于 2012-12-27T03:43:05.613 回答