Ответ в теме: Сумма элементов ниже главной диагонали на 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 возвращает элемент матрицы с заданными индексами.