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