オランダ国旗問題のソルバーを作ろうとしています。基本的には、リストを与えられて、赤白青の順に並べ替えたいと思います。赤、白、青は述語 (つまり、赤 (x)、白 (x) など) によって定義されます。現在、次のコードがあります。
red(1).
white(2).
blue(3).
dutch(Xs,Ys):-
getRed(Xs,[], Red), getWhite(Xs,[],White), getBlue(Xs,[],Blue),
append([], Red, Y1), append(Y1, White, Y2), append(Y2, Blue, Ys).
getRed([],Rs,Rs).
getRed([X|Rest], Acc, Rs) :- red(X), getRed(Rest, [X,Acc] , Rs).
getRed([X|Rest], Acc, Rs) :- getRed(Rest, Acc, Rs).
getWhite([],Rs,Rs).
getWhite([X|Rest], Acc, Rs) :- white(X), getWhite(Rest, [X,Acc], Rs).
getWhite([X|Rest], Acc, Rs) :- getWhite(Rest, Acc, Rs).
getBlue([],Rs,Rs).
getBlue([X|Rest], Acc, Rs) :- blue(X), getBlue(Rest, [X,Acc], Rs).
getBlue([X|Rest], Acc, Rs) :- getBlue(Rest, Acc, Rs).
私の出力は次のようになります。
?- dutch([1,2,3],R).
R = [1, [], 2, [], 3, []]
R = [1, [], 2, []]
R = [1, [], 3, []]
R = [1, []]
R = [2, [], 3, []]
R = [3, []]
R = []
私が欲しいのは、それが次のようになることです:
R = [1, 2, 3]
出力を希望どおりにするためにいくつかの方法を試しましたが、どこにも近づくことができませんでした。
編集:すべての可能なセットを並べ替え、セットが「オランダの旗」の順序であるかどうかを評価するブルート フォース ソリューションを使用して解決できるようです。しかし、より良い解決策はありますか?