Листинг Б.1. Определения часто используемых предикатов
% Файл 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
Приложение Б. Некоторые часто используемые предикаты