2014-12-08 32 views
2

我試圖列出所有排列從1到N的列表*排列序言

示例:perm(3,X)。 - > X = [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2, 1]]

我不但得不到

X = [1,2,3]

X = [1,3,2]

X = [2,1,3]

X = [2,3,1]

X = [3,1,2]

X = [3,2,1]

並且必須繼續打下。我的問題是如何將X的所有值放入像我想要的示例運行列表中。這裏是我現有的代碼:

permHelp([],[]). 
permHelp(List,[H|Finish]):-delete(H,List,Rest),permHelp(Rest,Finish). 

delete(X,[X|T],T). 
delete(X,[H|T],[H|NT]):-delete(X,T,NT). 

createList(0, L, L) :- !. 
createList(N, R, L) :- N > 0, N1 is N-1, createList(N1, [N|R], L). 

perm(N, X):- createList(N, [], L), permHelp(L, X). 
+0

請參閱[這個答案](http://stackoverflow.com/a/8394843/772868) – false 2014-12-08 02:54:27

+0

可能重複[置換到列表SWI-Prolog](http://stackoverflow.com/questions/8385423/permute -int-a-list-swi-prolog) – dasblinkenlight 2014-12-08 02:55:58

+0

@false你發現了一個非常接近的副本。我投票結束這個問題的重複。 – dasblinkenlight 2014-12-08 02:57:50

回答

1
perm(N, X):- 
    createList(N, [], L), 
    list_allperms(L, X). 

隨着list_allperms/2在另一個答案定義。

你所說的permHelp應該叫做permutation