Удалить элементы равные последнему и посчитать сумму оставшегося списка - Prolog

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

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

Подскажете как добавить рекурсию, так чтобы удалять элементы равные последнему и посчитать сумму оставшегося списка?
Листинг программы
  1. DOMAINS
  2. list = integer*
  3. PREDICATES
  4. member(integer, list)
  5. nondeterm del(integer,list,list)
  6. CLAUSES
  7. member(X,[X|L]):-!.
  8. member(X,[_|L]):-member(X,L).
  9. del(X,[X|L],L):-!.
  10. del(X,[X|L],[X|L1]):-del(X, L,L1).
  11. GOAL
  12. X=4,
  13. L=[4,1,4,3,4],member(4,L),
  14. del(X,L,L1).
Я тут немного не понял задание, нужно подсчитать количество элементов оставшегося списка, а вот моя программа удаляет только первый элемент списка.

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

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4.  
  5. predicates
  6. nondeterm last(intl,int)
  7. nondeterm del(intl,int,intl)
  8. nondeterm dlina(intl,int)
  9. nondeterm task(intl,int)
  10.  
  11. clauses
  12. last([X],X):- !.
  13. last([_|R],X) :-last(R,X).
  14.  
  15. del([],_,[]).
  16. del([X|T],X,R) :- del(T,X,R).
  17. del([Y|T],X,[Y|R]) :- X<>Y, del(T,X,R).
  18.  
  19. dlina([],0).
  20. dlina([H|T],S) :- dlina(T,SS), S=SS+H.
  21.  
  22. task(X,S) :- last(X,L), del(X,L,XX), dlina(XX,S).
  23. goal
  24. X=4, S=[4,1,4,3,4], del(S,X,R),task(X,L),dlina(XX,S).

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

В коде присутствуют следующие элементы:

  1. domains - определения типов данных для переменных. В данном случае, int - целочисленный тип данных, intl - указатель на целочисленный тип данных.
  2. predicates - определения функций (предикатов). В данном случае, last - функция для поиска последнего элемента в списке, del - функция для удаления элементов из списка, dlina - функция для подсчета суммы элементов списка, task - функция для выполнения основной задачи.
  3. clauses - определения правил для функций. В данном случае, last([X],X) - правило для функции last, которое означает, что если список пустой или состоит только из одного элемента, то этот элемент является последним. del([],_,[]) - правило для функции del, которое означает, что если список пустой, то после удаления элемента он остается пустым. del([X|T],X,R) - правило для функции del, которое означает, что если в списке есть элементы, то после удаления элемента X, оставшиеся элементы списка T и новый список R остаются неизменными. dlina([],0) - правило для функции dlina, которое означает, что если список пустой, то его сумма равна нулю. dlina([H|T],S) - правило для функции dlina, которое означает, что сумма элементов списка равна сумме элементов оставшегося списка T и значения H.
  4. goal - определение цели задачи. В данном случае, X=4, S=[4,1,4,3,4] - начальные значения переменных, del(S,X,R) - удаление элементов из списка S, task(X,L) - выполнение основной задачи, dlina(XX,S) - подсчет суммы оставшегося списка XX. Таким образом, код выполняет задачу по удалению элементов равных последнему и подсчету суммы оставшегося списка.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

14   голосов , оценка 4.071 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы