/* dutch(Xs,RedsWhitesBlues) :- RedsWhitesBlues is a list of elements of Xs ordered by color: red, then white, then blue. */ dutch(Xs,RedsWhitesBlues) :- distribute(Xs,Reds,Whites,Blues), append(Whites,Blues,WhitesBlues), append(Reds,WhitesBlues,RedsWhitesBlues). /* distribute(Xs,Reds,Whites,Blues) :- Reds, Whites, and Blues are the lists of red, white, and blue elements in Xs, respectively. */ distribute([red(X)|Xs],[red(X)|Reds],Whites,Blues) :- distribute(Xs,Reds,Whites,Blues). distribute([white(X)|Xs],Reds,[white(X)|Whites],Blues) :- distribute(Xs,Reds,Whites,Blues). distribute([blue(X)|Xs],Reds,Whites,[blue(X)|Blues]) :- distribute(Xs,Reds,Whites,Blues). distribute([],[],[],[]). % Program 15.5: A solution to the Dutch flag problem