Создать предикат определения множества пересечения двух списков - Prolog

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

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

хеееелп ми Создать предикат определения множества пересечения двух списков

Решение задачи: «Создать предикат определения множества пересечения двух списков»

textual
Листинг программы
  1. domains
  2. int=integer
  3. intl=int*
  4.  
  5. predicates
  6.  
  7. memb(int,intl)
  8. inters(intl,intl,intl)
  9. readlist(intl)
  10.  
  11. clauses
  12.  
  13. memb(_,[])    :- fail.
  14. memb(X,[X|_]).
  15. memb(X,[Y|T]) :- X <> Y, memb(X,T).
  16.  
  17. inters([],_,[]).
  18. inters([X|T],V,[X|Z]) :- memb(X,V), inters(T,V,Z).
  19. inters([X|T],V,Z)     :- not(memb(X,V)), inters(T,V,Z).
  20.  
  21. readlist([H|T]) :- readint(H),!,readlist(T).
  22. readlist([]).
  23.  
  24. goal
  25. write("Enter 1-st list:"),nl,readlist(X),nl,write("Enter 2-nd list:"),nl,readlist(Y),inters(X,Y,R),
  26. write("Intersection: "),write(R),nl.

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

В этом коде определены три предиката:

  1. memb(int,intl) - предикат, который проверяет, является ли число int элементом списка intl. Если число присутствует в списке, то возвращается пустой список, иначе возвращается исходный список без изменений.
  2. inters(intl,intl,intl) - предикат, который находит пересечение двух списков intl.
  3. readlist(intl) - предикат, который считывает элементы списка из стандартного ввода. Код также содержит три клаузы:
  4. memb(_,[]):- fail(X). - если первый аргумент пуст, то возвращается ошибка.
  5. memb(X,[X|_]). - если первый аргумент не пуст и равен последнему элементу списка, то возвращается пустой список.
  6. memb(X,[Y|T]) :- X <> Y, memb(X,T). - если первый аргумент не равен последнему элементу списка, то рекурсивно вызывается предикат memb для оставшейся части списка.
  7. inters([],_,[]). - если первый аргумент пуст, то возвращается пустой список.
  8. inters([X|T],V,[X|Z]) :- memb(X,V), inters(T,V,Z). - если первый аргумент не пуст и его первый элемент присутствует во втором списке, то рекурсивно вызывается предикат inters для оставшейся части первого списка.
  9. inters([X|T],V,Z) :- not(memb(X,V)), inters(T,V,Z). - если первый аргумент не пуст и его первый элемент отсутствует во втором списке, то рекурсивно вызывается предикат inters для оставшейся части первого списка.
  10. readlist([H|T]) :- readint(H),!,readlist(T). - если первый элемент списка успешно считан, то вызывается предикат readlist для оставшейся части списка.
  11. readlist([]). - если список пуст, то возвращается пустой список. В основной части кода вызываются предикаты readlist для считывания двух списков, а затем вызывается предикат inters для нахождения их пересечения. Результат выводится на экран.

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


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

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

10   голосов , оценка 4.2 из 5

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

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

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