Ответ в теме: Найти наибольший (наименьший) элемент диагоналей матрицы

      Комментарии к записи Ответ в теме: Найти наибольший (наименьший) элемент диагоналей матрицы отключены
#2029

Так как матрица представлена списком списков (списком строк), то для перебора элементов диагонали матрицы необходимо сначала извлечь i-тую строку, а затем получить элемент соответствующей диагонали (j-того столбца). Для главной диагонали j = i, для побочной j = n-i-1.

main_diagonal_max(Index, [Row], Max):-
!, nth0(Index, Row, Max).
main_diagonal_max(Index, [Row|TailRows], Max):-
TailIndex is Index + 1, 
main_diagonal_max(TailIndex, TailRows, TailMax),
nth0(Index, Row, RowMax),
Max is max(RowMax, TailMax).

Для получения элемента списка с заданным индексом используется встроенное правило nth0. Если матрица состоит из одной строки — то решение очевидно, иначе — выбирается диагональный элемент текущей строки, а остальная матрица обрабатывается рекурсивно. Из наибольшего элемента «хвоста матрицы» и максимума текущей строки формируется результат. Функция max является встроенной, но если в вашем диалекте (например Turbo Prolog) ее нет — можно реализовать самостоятельно:

max(A, B, A):- A > B, !.
max(_A, B, B).

Для вычисления наибольшего элемента побочный диагонали на каждом шаге потребуется значение размера матрицы, либо можно изначально вычислить индекс диагонального элемента первой строки (n-1) и уменьшать его на каждом последующем шаге алгоритма.

second_diagonal_max(Matrix, Max):-
length(Matrix, Size), Index is Size - 1,
second_diagonal_max(Index, Matrix, Max).
second_diagonal_max(Index, [Row], Max):-
!, nth0(Index, Row, Max).
second_diagonal_max(Index, [Row|TailRows], Max):-
TailIndex is Index - 1, nth0(Index, Row, RowMax),
second_diagonal_max(TailIndex, TailRows, TailMax),
Max is max(RowMax, TailMax).

Для определения размера (количества строк) матрицы используется стандартная функция length. Поиск минимальных элементов будет выполняться аналогично.