% Файл frequent.pl: библиотека чаете используемых предикатов % Отрицание как недостижение цели
% Обычно эта операций реализуется в виде встроенного предиката, а для 4 ее обозначения часто применяется префиксный оператор ' \ + ', например \ в форме \+likes(тагу,snakes)
% Приведенное ниже определение предназначено исключительно для обеспечения * совместимости различных реализаций Prolog:- Op(900, fy, not). not Goal:-Goal,!, fail
true.
Ъ once[ Goal}: предикат, который формирует только одно решение для цели Goal
% (в качестве него берется первое же полученное решение)
% Этот предикат может быть уже предоставлен в конкретной реализации
% как встроенный
once(Goal):-
Goal,!. i member(X, List): предикат, который определяет принадлежность элемента X 1 к списку List
member (К, [ X I _]) • ,л X - Белова списка.
member(X, [ _ I Rest]):-
member(X, Rest). % X находится в теле списка
% cone (Ыл L2, L3): список L3 — конкатенация списков L1 и L2
сопс([],L,L).
cone! [X I LI}, L2, [X I L3]):-concl LI, L2, L3).
% del (X, LD, L): список L соответствует списку LO с удаленным элементом X % Примечание. Происходит удаление только одного экземпляра элемента X % Вызов предиката на выполнение завершается неудачей, если элемент X Ъ отсутствует в списке L0
del(X, [X I Rest], Rest). % Удалить элемент X, если он составляет
% голову списка
del! х, [Y [ RestO], [Y \ Rest]):-
dell X, RestO, Rest). % Удалить элемент Х из хвоста списка
% subset{ Set, Subset): предикат, который позволяет проверить, действительно ли
% список Set содержит Есе элементы списка Subset (проверить принадлежность
i подмножества к множеству)
% Примечание. Элементы списка Subset находятся в списке Set в том же порядке,
% что и в списке Subset
subset! [],[)>•
subset([First I Rest], [First | Sub]):- % Оставить элемент First
% з подмножестве subset(Rest, Sub),
subset([First | Rest], Sub):- i Удалить элемент First subset! Best, Sub).
i set_difference[ Setl, Set2, Set3); список Set3 определяется как разность
I множеств, представленных в виде списков Setl и Set2
% Обычно этот предикат используется Б такой форме: списки Setl и Set2 задаются
% как входные параметры, a Set3 - как выходной
set_dif ference ([]._,[]).
set_difference! [X | SI], S2, S3):-
member! X, S2),!, % Элемент Х принадлежит к множеству 32
set_difference! SI, S2, S3).
set_difference([X | SI], S2, [X | S3]):- % Элемент Х не принадлежит
Ъ к множеству S2 set_differenceI SI, S2, S3).
t length! List, Length): предикат, позволяющий определить длину Length
% списка List
% Примечание. Предикат length/2 может быть уже включен в состав встроенных
% предикатов конкретной версии Prolog
i В приведенном ниже определении используется хвостовая рекурсия
I Этот предикат может использоваться для эффективной выработки списков
i заданной длины
length; L, Ы):-length(L, О, К).
length! [], N, N).
length! [_ | L], N0, И):-N1 is HG + 1, length [ L, N1, N).
% max[ X, Y, Как): элемент Мах - наибольший среди X и Y
шах(Х, Y, Мах):-X>=Y,!, Мая = X
Приложение Б. Некоторые часто используемые предикаты
Max = Y.
% min(X, Y, Min): элемент Min - наименышй среди Х и Y
rcinix, Y, Min):-X =< 4,!, Min - X
Min = Y.
% copy_term(Tl, T2); терм T2 равен Tl, эа исключением того, что переменным
% присвоены другие имена
% Этот предикат может Сыть уже предоставлен в конкретной реализации как
% встроенный
% В соответствии с приведенным ниже определением процедуры вызов
* предиката copy_term происходит таким оПраэом, что Т2 согласуется с Т1
copy_term(Term, Copy):-
asserta(term_to_copy < Term!), retract(tetm_to_copy(Copy!),!.
594
Приложение Б. Некоторые часто используемые предикаты