2013-11-02 9 views
0

Я могу создать список от 0 до N и перестановить его. Но как я могу сделать это в матрицу и перестановку каждой строки только от matrix(2,L).создать матрицу и перестановочить каждую строку

add(X,L,[X|L]). 
add(X,[L|H],[L|R]):- add(X,H,R). 

permut([],[]). 
permut([L|H],R):- permut(H,R1),add(L,R1,R). 

permutations(L,R):- findall(P,permut(L,P),R). 

do_list(N, L) :- do_list1(N, [], L). 

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

matrix(N,L):- 
    do_list(N,R), 
    permut(R,L). 
+0

Вы хотите создать N x N! где каждая строка является другой перестановкой одного и того же списка длины 'N'? – lurker

+0

Да, я хочу создать матрицу N x N и перестановку каждой строки, пока она не станет латинской площадью – user2947488

ответ

0

не уверен о вашем запросе. Вот возможный ответ на основе встроенных ...

3 ?- [user]. 
|: matrix(N, Mat) :- length(Rows, N), maplist(numlist(1,N), Rows), maplist(permutation, Rows, Mat). 

% user://1 compiled 0.01 sec, 2 clauses 
true. 

4 ?- matrix(3, M). 
M = [[1, 2, 3], [1, 2, 3], [1, 2, 3]] ; 
M = [[1, 2, 3], [1, 2, 3], [1, 3, 2]] ; 
M = [[1, 2, 3], [1, 2, 3], [2, 1, 3]] ; 
M = [[1, 2, 3], [1, 2, 3], [2, 3, 1]] ; 
...