Листинг 7.3. Реализация отношения findall

findall! х, Goal, Xlist) :-

call С Goal), % Найти решение

assertzt queue (X) ), \ Внести его э базу данных

fail; % Попытаться найти другие решения

assertzt queue (bottom) ), 6 Отметить конец очереди решений

collect [ Xlist) . % Собрать решения

collect( L):-

retract! queue(X)], I, % Извлечь следующее решение
( X == bottom, ! , L = И Решения закончились?

L = [X I Rest], collect! Rest) ), % В противно.'.' случае собрать остальное

Упражнения

7.8. Примените процедуру bagof для определения отношения powerset ( Set, Subsets), которое вычисляет множество всех подмножеств заданного множе­ства (все множества представлены в виде списков).

7.9. Примените процедуру bagof для определения отношения copy_terre( Term,Copy)

такого, что Сору представляет собой терм 1 ~ со всеми переименованными переменными.

Резюме

• В любой реализации Prolog обычно предусмотрен набор встроенных процедур,
позволяющих осуществить несколько полезных операций, которые невозмож­
ны в базовой версии языка Prolog. В данной главе представлен подобный на­
бор предикатов, доступных во многих реализациях Prolog.

Тип терма можно проверить с помощью предикатов, перечисленных ниже.

• var [ X). X —(неконкретизнрованная) переменная.

• nonvarf X), х- не переменная.

• atom! X]. X — атом.

 

• integer [ X). X - целое число,

• float ( X). X - действительное число.


Глава 7. Дополнительные встроенные предикаты




 

• atomic ( X). X является либо атомом, либо числом.

• compound [ X). X - структура.

Для создания или декомпозиции, термов могут применяться следующие пре­дикаты:

Term =.. [ Functor | ArgwmentList]

functor { Term, Functor, Arity) arg(H, Term, Argument)

name{ Atom, CharacterCodes)

Над термами могут выполняться описанные ниже операции сравнения.

X = Y. X и Y согласуются.

X == Y. X и Y идентичны.

X \= Y. X и Y не идентичны.

X =: = Y. Арифметические значения X и Y равны.

X =\= Y.Арифметические значения X и Y не равны.

X < Y Арифметическое значение X меньше Y (к этому же типу относятся операторы -<:, >, >=).

X @< Y Терм X предшествует терму Y (к этому же типу относятся операто­ры @=<, 8>, §>■=),

Программу Prolog можно рассматривать как реляционную базу данных, для обновления которой предусмотрены описанные ниже процедуры.

• assert < Clause). Добавление предложения Clause к программе.

• assertaf Clause) . Добавление в начале.

• assertz { Clause). Добавление в конце.

• retract ( Clause). Удаление предложения, которое согласуется с предло­
жением Clause.

Все объекты, соответствующие заданному условию, могут быть собраны в спи­сок с помощью описанных ниже предикатов.

• bagof ( X, Р, L). L — список из всех X, которые соответствуют условию?.

• setof ( X, Р, L), L— отсортированный список из всех X, которые соот­
ветствуют условию Р.

• findall ( X, Р, Lb Аналогичен bagof.

repeat — средство управления, которое вырабатывает неограниченное количе­ство вариантов для перебора с возвратами.


 



Часть I. Язык Prolog