我正在尝试解决荷兰国旗问题。基本上,给定一个列表,我想按照红-白-蓝的顺序对它们进行排序。红色、白色和蓝色由它们的谓词定义(即红色(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]
我已经尝试了几种方法来强制输出我想要的,但一直无法接近。
编辑:看起来我可以通过使用置换所有可能集合并评估集合是否按“荷兰国旗”顺序的蛮力解决方案来解决它。不过有更好的解决方案吗?