Ответ в теме: Вычисление суммы диагоналей матрицы на Prolog

      Комментарии к записи Ответ в теме: Вычисление суммы диагоналей матрицы на Prolog отключены
#2026

У элементов главной диагонали индекс столбца совпадает с индексом строки.
Матрица представлена списком списков – списком строк. Чтобы получить элемент на диагонали i-той строки – достаточно получить i-тый элемент соответствующего списка. Для получения элемента с заданным индексом можно использовать функцию nth0.

main_diagonal_sum(Size, Size, _Matrix, 0):-!.
main_diagonal_sum(Index, Size, [Row|TailRows], Sum):-
  NextIndex is Index + 1, 
  main_diagonal_sum(NextIndex, Size, TailRows, TailSum),
  nth0(Index, Row, Element), Sum is TailSum + Element.

Функция перебирается строки матрицы до тех пор, пока не переберет их всех (значение индекса текущей строки не совпадет с их общим количеством). Для каждой строки вызывается функция nth0, полученное значение добавляется к результату рекурсивного вызова.

Вычисление суммы элементов побочной диагонали выполняется аналогично, но индекс диагонального элемента в i-той строке определяется как n-i-1, где n – размер матрицы, i – индекс строки.

second_diagonal_sum(Size, Size, _Matrix, 0):-!.
second_diagonal_sum(Index, Size, [Row|TailRows], Sum):-
  NextIndex is Index + 1, 
  second_diagonal_sum(NextIndex, Size, TailRows, TailSum),
  ColumnIndex is Size - Index - 1, nth0(ColumnIndex, Row, Element), 
  Sum is TailSum + Element.

Примеры использования функций:

?- second_diagonal_sum(0, 3, [[1,2,3],[4,5,6],[8,8,9]], Sum).
Sum = 16.

?- main_diagonal_sum(0, 3, [[1,2,3],[4,5,6],[8,8,9]], Sum).
Sum = 15.