创建一个矩阵并置换每一行

时间:2013-11-02 10:09:24

标签: matrix prolog permutation latin-square

我可以创建一个从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).

1 个答案:

答案 0 :(得分: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]] ;
...