Оставить в первом списке элементы, которые входят во второй список только один раз - Prolog

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

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

Есть 2 списка. Оставить в первом только те элементы, которые есть во втором только в одном экземпляре.

Решение задачи: «Оставить в первом списке элементы, которые входят во второй список только один раз»

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4. intll=intl*
  5.  
  6. predicates
  7. len(intl,int)
  8. del(intl,int,intl)
  9. mkpair(intl,intll)
  10. mklist(intll,intl)
  11. task(intl,intl)
  12.  
  13. clauses
  14. len([],0).
  15. len([_|T],N) :- len(T,N1), N=N1+1.
  16.  
  17. del([],_,[]).
  18. del([X|T],X,R) :- del(T,X,R).
  19. del([H|T],X,[H|R]) :- H<>X, del(T,X,R).
  20.  
  21. mkpair([],[]).
  22. mkpair([H|T],[[H,N]|R]):- del(T,H,TD), len(T,L0), len(TD,L), N=L0-L+1, mkpair(TD,R).
  23.  
  24. mklist([],[]).
  25. mklist([[X,1]|R],[X|T]) :- mklist(R,T).
  26. mklist([[_,N]|R],T) :- N>1, mklist(R,T).
  27.  
  28. task(X,R) :- mkpair(X,XX), mklist(XX,R).

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

  1. Первый пролог-файл (domains и predicates) описывает пространство имен и набор предикатов для работы с списками.
  2. Второй пролог-файл (clauses и tasks) содержит правила работы с этими списками.
  3. В функции len([],0) определяется длина пустого списка равная 0.
  4. Функция len([_|T],N) рекурсивно вызывает функцию len(T,N1), увеличивая значение N на единицу.
  5. Функция del([],_,[]) определяет удаление элемента из пустого списка как пустой список.
  6. Функция del([X|T],X,R) рекурсивно вызывает функцию del(T,X,R).
  7. Функция del([H|T],X,[H|R]) рекурсивно вызывает функцию del(T,X,R), если элемент H не равен X.
  8. Функция mkpair([],[]) определяет пустой список пар как пустой список.
  9. Функция mkpair([H|T],[[H,N]|R]):- del(T,H,TD), len(T,L0), len(TD,L), N=L0-L+1, mkpair(TD,R). рекурсивно вызывает функцию del для создания списка пар без элемента H.
  10. Функция mklist([],[]) определяет пустой список как пустой список.
  11. Функция mklist([[X,1]|R],[X|T]) :- mklist(R,T). рекурсивно вызывает функцию mklist для каждого элемента списка, кроме последнего.
  12. Функция mklist([[_,N]|R],T) :- N>1, mklist(R,T). рекурсивно вызывает функцию mklist для каждого элемента списка, если длина элемента больше одного.
  13. Функция task(X,R) :- mkpair(X,XX), mklist(XX,R). рекурсивно вызывает функции mkpair и mklist для решения задачи.
  14. Код выполняет следующие действия:
    • Создает список пар без повторяющихся элементов (удаляет дубликаты).
    • Создает список из элементов первого списка, которые встречаются более одного раза.
    • Решение задачи выполняется путем рекурсивного вызова функций del, len, mkpair и mklist.
    • Код может быть использован для удаления повторяющихся элементов из первого списка и создания списка из уникальных элементов.

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


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

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

11   голосов , оценка 3.545 из 5

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

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

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