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

プロローグが最初の句で統一できない述語を使用しているためです。

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].

ただし、ライブラリ ( apply ) でProlog を使用している場合は、

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

上記と同じ結果を返します

于 2012-12-27T03:43:05.613 に答える