Создать предикат определения множества пересечения двух списков - 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
для нахождения их пересечения. Результат выводится на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д