Создать предикат определения множества пересечения двух списков - 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.
Объяснение кода листинга программы
В этом коде определены три предиката:
memb(int,intl)- предикат, который проверяет, является ли числоintэлементом спискаintl. Если число присутствует в списке, то возвращается пустой список, иначе возвращается исходный список без изменений.inters(intl,intl,intl)- предикат, который находит пересечение двух списковintl.readlist(intl)- предикат, который считывает элементы списка из стандартного ввода. Код также содержит три клаузы:memb(_,[]):- fail(X).- если первый аргумент пуст, то возвращается ошибка.memb(X,[X|_]).- если первый аргумент не пуст и равен последнему элементу списка, то возвращается пустой список.memb(X,[Y|T]) :- X <> Y, memb(X,T).- если первый аргумент не равен последнему элементу списка, то рекурсивно вызывается предикатmembдля оставшейся части списка.inters([],_,[]).- если первый аргумент пуст, то возвращается пустой список.inters([X|T],V,[X|Z]) :- memb(X,V), inters(T,V,Z).- если первый аргумент не пуст и его первый элемент присутствует во втором списке, то рекурсивно вызывается предикатintersдля оставшейся части первого списка.inters([X|T],V,Z) :- not(memb(X,V)), inters(T,V,Z).- если первый аргумент не пуст и его первый элемент отсутствует во втором списке, то рекурсивно вызывается предикатintersдля оставшейся части первого списка.readlist([H|T]) :- readint(H),!,readlist(T).- если первый элемент списка успешно считан, то вызывается предикатreadlistдля оставшейся части списка.readlist([]).- если список пуст, то возвращается пустой список. В основной части кода вызываются предикатыreadlistдля считывания двух списков, а затем вызывается предикатintersдля нахождения их пересечения. Результат выводится на экран.