Ответ в теме: Сумма элементов ниже главной диагонали на Prolog

      Комментарии к записи Ответ в теме: Сумма элементов ниже главной диагонали на Prolog отключены
#2036

При обработке матрицы на Prolog потребуются индексы и размер массива. Размер нужен для обнаружения состояния, в котором все элементы матрицы обработаны. Определение размера и инициализацию индексов начальными значениями можно вынести в отдельную функцию:

sum_under_main_diagonal(Matrix, Sum):-
length(Matrix, Size),
sum_under_main_diagonal(Matrix, Size, 0, 0, Sum).

Основная функция должна:

  • вернуть ноль если все элементы обработаны;
  • перейти к обработке следующей строки если текущая строка матрицы закончилась;
    • мысленно разделить матрицу на текущий элемент и остальные («хвост»);
    • рекурсивно обработать хвост, в результате получить промежуточный результат
    • соединить результат с текущим элементом (если элемент расположен ниже главной диагонали — он добавляется, иначе — игнорируется);

sum_under_main_diagonal(_Matrix, Size, RowIndex, _ColumnIndex, 0):-
RowIndex >= Size, !.
sum_under_main_diagonal(Matrix, Size, RowIndex, ColumnIndex, Sum):-
ColumnIndex >= Size, !, 
NextRowIndex is RowIndex + 1,
sum_under_main_diagonal(Matrix, Size, NextRowIndex, 0, Sum).
sum_under_main_diagonal(Matrix, Size, RowIndex, ColumnIndex, Sum):-
NextColumnIndex is ColumnIndex + 1,
sum_under_main_diagonal(Matrix, Size, RowIndex, NextColumnIndex, TailSum),
element_processing(Matrix, RowIndex, ColumnIndex, TailSum, Sum).

Для исключения дублирования кода соединение результатов вынесено в отдельную функцию:

element_processing(Matrix, RowIndex, ColumnIndex, TailSum, Sum):-
RowIndex > ColumnIndex, !, 
get_matrix_element(Matrix, RowIndex, ColumnIndex, Element),
Sum is TailSum + Element.
element_processing(_Matrix, _RowIndex, _ColumnIndex, Sum, Sum).

Функция get_matrix_element возвращает элемент матрицы с заданными индексами.