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

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

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

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

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

textual
Листинг программы
domains
int=integer
intl=int*
 
predicates
 
memb(int,intl)
inters(intl,intl,intl)
readlist(intl)
 
clauses
 
memb(_,[])    :- fail.
memb(X,[X|_]).
memb(X,[Y|T]) :- X <> Y, memb(X,T).
 
inters([],_,[]).
inters([X|T],V,[X|Z]) :- memb(X,V), inters(T,V,Z).
inters([X|T],V,Z)     :- not(memb(X,V)), inters(T,V,Z).
 
readlist([H|T]) :- readint(H),!,readlist(T).
readlist([]).
 
goal
write("Enter 1-st list:"),nl,readlist(X),nl,write("Enter 2-nd list:"),nl,readlist(Y),inters(X,Y,R),
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
Похожие ответы