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

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

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

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

    questioner
    Участник

    Помогите написать программу на Пролог для поиска суммы элементов, расположенных ниже главной диагонали в матрице. Матрица задана списком списков.
    На рисунке показаны элементы, расположенные ниже главной диагонали. Видно, что у них индекс строки больше индекса столбца.

  • #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 возвращает элемент матрицы с заданными индексами.

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