Умножить элемент списка на его номер - Prolog

Узнай цену своей работы

Формулировка задачи:

Нужно умножить элемент списка на его номер, потом найти сумму, я понимаю, что как-то нужно уменьшать на 1 Len после каждого "цикла" или находить новую длину "хвоста", но не получается. Мой вариант умножает каждый элемент на общую длину и суммирует. Visual Prolog 5.2

Решение задачи: «Умножить элемент списка на его номер»

textual
Листинг программы
domains
int=integer
intl=int*
 
predicates
mul_by_num(intl,int,intl)
sum_list(intl,int)
task(intl,int)
 
clauses
mul_by_num([],_,[]).
mul_by_num([H|T],N,[HH|TT]) :- HH=H*N, NN=N+1, mul_by_num(T,NN,TT).
 
sum_list([],0).
sum_list([H|T],S) :- sum_list(T,S1), S=S1+H.
 
task(L,R) :- mul_by_num(L,1,LL), sum_list(LL,R).

Объяснение кода листинга программы

Код на языке Prolog с данной постановкой задачи - Умножить элемент списка на его номер можно разбить на следующие шаги:

  1. Определение типов данных:
    • int - целочисленный тип данных
    • intl - список целочисленных значений (int*)
  2. Определение predicates (предикатов):
    • mul_by_num(intl,int,intl) - предикат для умножения элемента списка на его номер
    • sum_list(intl,int) - предикат для суммирования элементов списка
    • task(intl,int) - предикат для выполнения основной задачи
  3. Определение clauses (условий):
    • mul_bynum([],,[]) - базовый случай для пустого списка
    • mul_by_num([H|T],N,[HH|TT]) - рекурсивный случай для списка, содержащего элемент H. Значение HH равно произведению H и N, а TT - результат рекурсивного вызова для оставшейся части списка T.
    • sum_list([],0) - базовый случай для пустого списка
    • sum_list([H|T],S) - рекурсивный случай для списка, содержащего элемент H. Значение S1 - сумма элементов оставшейся части списка T, а S - результат рекурсивного вызова с добавлением значения H к S1.
    • task(L,R) - предикат для выполнения основной задачи. Значение R вычисляется путем последовательного умножения элементов списка L на их номера и суммирования полученных произведений. Таким образом, код выполняет следующие шаги:
  4. Создание списка LL из исходного списка L путем умножения каждого элемента на его номер.
  5. Вычисление суммы элементов списка LL и получение значения R. Пример вызова: ?- task([1,2,3,4],R). Вывод: R = 24.

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы