Ответ в теме: Транспонирование матрицы на Prolog

      Комментарии к записи Ответ в теме: Транспонирование матрицы на Prolog отключены
#2040

Правило должно заменить строки столбцами, но матрица представлена списком строк — поэтому мы всегда можем создать строку матрицы, остается лишь получить столбцы в нужном порядке.
Для получения столбца с заданным индексом последовательно переберем строки матрицы и извлечем из них соответствующий элемент при помощи встроенного предиката. Условие окончания рекурсии — пустой исходный список, в этом случае функция возвращает пустой список вне зависимости от значения итератора.

get_column(_ColumnNumber, [], []):-!.
get_column(ColumnNumber, [Row|Tail], [Element|TailColumn]):-
nth0(ColumnNumber, Row, Element), 
get_column(ColumnNumber, Tail, TailColumn).

Для транспонирования матрицы надо последовательно извлечь все столбцы, начиная с нулевого и записать их в новую матрицу в качестве строк. Вспомогательная функция может передавать ноль в качестве начального индекса столбца.

transposition(Matrix, TransposeMatrix):-
transposition(0, Matrix, TransposeMatrix).
transposition(Iterator, Matrix, [Column|TransposeTail]):-
TailIterator is Iterator + 1,
get_column(Iterator, Matrix, Column), !,
transposition(TailIterator, Matrix, TransposeTail).
transposition(_Iterator, _Matrix, []).

Если все строки матрицы обработаны, то отделить очередной столбец не получится — функция get_column не сработает. В этом случае результатом работы является пустой список.

Пример работы программы на SWI Prolog:

?- transposition([[1,2],[4,5],[7,8]], TransposeMatrix).
TransposeMatrix = [[1, 4, 7], [2, 5, 8]].