Вот простой Пролог для транспонирования матрицы в представлении списков.Идея состоит в том, чтобы создать новую «первую строку», потянув за голову от каждой существующей строки, а затем повторить список «оставшихся» хвостов.
transpose([[ ]|_],[ ]) :- !.
transpose(A,[H|T]) :-
decap_List(A,H,B),
transpose(B,T).
decap_List([ ],[ ],[ ]).
decap_List([[H|T]|Rows],[H|Hs],[T|Ts]) :-
decap_List(Rows,Hs,Ts).
Например:
?- transpose([[1,2,3],[4,5,6],[7,8,9]],X).
X = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
Заметьте, однако, что для обобщенной матрицы судоку размером K²xK² у вас также есть «все разные» записи в каждом «поле» размера KxK для разбиения матрицы.Используя тот же дизайн, что и раньше, вам также понадобится предикат для переупаковки матрицы судоку в список «коробочных» списков.
Для этого требуется только дополнительный предикат для «разбиения» матрицы на группы. K строк на штуку.
part_K_rows([ ],_,[ ]) :- !.
part_K_rows(A,K,[H|T]) :-
get_K_rows(A,K,H,B),
part_K_rows(B,K,T).
get_K_rows(A,0,[ ],A) :- !.
get_K_rows([H|T],K,[H|Z],B),
J is K-1,
get_K_rows(T,J,Z,B).
Применение part_K_rows / 3 к исходной матрице судоку, затем транспонирование каждого из полученных разделов строки и применение part_K_rows /3 каждому из них выдаст необходимый список «коробочных» списков.