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