II. Вопрос 19.1
19 asserta/assertz, retract, findall, bagof/setof
Предикаты динамического изменения базы данных Пролога:
asserta/assertz, retract. Примеры. Предикаты поиска множества решений:
findall, bagof/setof.
C http://www.webauto.ru/forum08/ (Древний, мертвый форум)
19.1 asserta/assertz, retract
В базу знаний(фактов и правил) Пролога можно добавлять факты и правила прямо
по ходу выполнения программы. Это осуществляется при помощи предикатов
• assert Как предусмотрено в большинстве реализаций Пролога, эквивалентен
assertz.
• asserta Добавляет факт/правило в начало базы.
• assertz Добавляет факт/правило в конец базы.
• retract Удаление факта.
Для того, чтобы добавить факт или правило в базу знаний, необходимо написать,
например, следующее:
1 assert( fact( a ) )
2 % или
3 assert( rule( X ):− fact( X ) )
Из следующего примера видно, как данные предикаты оказывают влияние на ре-
зультаты запросов:
1 ?− assert( fact( b ) ), assertz( fact( c ) ), assert(fact( d ) ), asserta( fact( a ) ).
2 Yes.
3 ?− fact( X ).
4 X = a;
5 X = b;
6 X = c;
7 X = d;
8 No.
Описываемые предикаты могут применяться в случаях, когда необходимо сохранить
ответы, на заданные пользователю вопросы в ходе работы программы (как например
в экспертных системах), или, например, для создания аналога глобальных перемен-
ных.
39