Определить, является ли первый список подмножеством второго - Prolog
Формулировка задачи:
Определить, является ли первый список подмножеством второго. Списки не имеют дубликатов.
Аргументы: первый список;
второй список.
?- pred([a,b,c],[s,a,e,c,d,b]).
yes
?-
Решение задачи: «Определить, является ли первый список подмножеством второго»
textual
Листинг программы
domains ch=char chl=ch* predicates is_in(ch,chl) is_subset(chl,chl) clauses is_in(_,[]):-fail. is_in(X,[X|_]):- !. is_in(X,[Y|T]):- X<>Y, is_in(X,T). is_subset([],_):- !. is_subset([X|T],Y) :- is_in(X,Y), is_subset(T,Y).
Объяснение кода листинга программы
domains- определяет типы данных для переменныхpredicates- определяет функции, которые будут использоваться в программеclauses- определяет правила, которые определяют поведение программыis_in(ch,chl)- функция, которая проверяет, есть ли символ в списке символовis_subset(chl,chl)- функция, которая проверяет, является ли один список подмножеством другогоis_in(_,[]):-fail.- если пустой список не содержит символ, то возвращается ошибкаis_in(X,[X|_]):- !.- если символ есть в начале списка, то возвращается успехis_in(X,[Y|T]):- X<>Y, is_in(X,T).- если символ не равен символу в начале списка, то рекурсивно вызывается функция для оставшейся части спискаis_subset([],_):- !.- если пустой список не содержит символов, то возвращается успехis_subset([X|T],Y) :- is_in(X,Y), is_subset(T,Y).- если символ из первого списка есть во втором списке, то рекурсивно вызывается функция для оставшейся части первого списка