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