Листинг Б.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


Приложение Б. Некоторые часто используемые предикаты