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

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

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 3 мес. назад.

  • Автор
    Сообщения
  • #2037

    questioner
    Участник

    Помогите написать функцию выполняющую транспонирование матрицы на языке 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]].

Для ответа в этой теме необходимо авторизоваться.