2013-06-20 57 views
1

我應該在Prolog中編寫一個程序,當它給出一個列表時,返回它的powerset的排列組合。 有一件事我忘了提及:我已經有一個反轉列表的謂詞:deep_reverse(List,RevList)。 例如:?-sublist_perm([a,b,c],X). 將返回:(允許重複)在Prolog中設置的功率排列

X = [] ; 
X = [c] ; 
X = [b] ; 
X = [b, c] ; 
X = [c, b] ; 
X = [a] ; 
X = [a, c] ; 
X = [c, a] ; 
X = [a, b] ; 
X = [b, a] ; 
X = [a, b, c] ; 
X = [b, a, c] ; 
X = [b, c, a] ; 
X = [a, c, b] ; 
X = [c, a, b] ; 
X = [c, b, a] 
+2

向我們展示您所做的「一堆不同的東西」。 –

+0

[gnu Prolog powerset modification]可能重複(http://stackoverflow.com/questions/4146117/gnu-prolog-powerset-modification) –

+1

我看着它,它不一樣。 –

回答

4

你在一個問題問兩兩件事:如何讓所有的子表,以及如何重排列的列表:

sublist_perm(In, Out) :- 
    sublist(In, Temp), 
    permutation(Temp, Out). 

sublist([], []). 
sublist([_|XS], YS) :- 
    sublist(XS, YS). 
sublist([X|XS], [X|YS]) :- 
    sublist(XS, YS). 

見還有:man page for permutation/2

findall(X, sublist_perm([a,b,c], X), XS), 
XS = [[],[c],[b],[b,c],[c,b],[a],[a,c],[c,a],[a,b],[b,a], 
     [a,b,c],[b,a,c],[b,c,a],[a,c,b],[c,a,b],[c,b,a]].