Доступ к программам и обработка программ
clause(?Head, ?Body)
Успех, когда Head может быть унифицирована с головой клаузы и Body с соответствующим телом клаузы. Выдает альтернативные клаузы при бэктрекинге (поиске с возвратом). Для фактов Body унифицируется с атомом true. Обычно clause/2 используется для нахождения определения предиката, но может также использоваться для нахождения головы клаузы при некотором заданном образце тела.
?- clause(member(X,Y),Body).
Body = true
X = G904
Y = [G904|G1336] ;
Body = member(G904, G1348)
X = G904
Y = [G1344|G1348] ;
No
Существуют системные предикаты, выполняющие добавление предложений к программе и удаление предложений из программы.
assert(+Term)
Добавляет факт или правило в программу (в базу данных в оперативной памяти). Term добавляется как последний факт или правило соответствующего предиката.
Например, решение цели
?- assert(father(tom, bob)).
добавляет в программу факт father. При добавлении правил следует вводить дополнительные скобки, чтобы учитывать старшинство термов. Например, синтаксически правильным является выражение
?- assert((parent(X,Y):-father(X,Y))).
Имеется вариант предиката assert, а именно, asserta, добавляющий предложение в начало процедуры.
retract(+Term). Когда терм Term унифицируется с первым подходящим фактом или клаузой в базе данных, факт или клауза удаляется из базы данных.
retractall(+Term). Удаляются все факты или клаузы в базе данных, что унифицируются с Term.
Пролог-программу можно рассматривать как реляционную базу данных: описание отношений частично присутствует в ней в явном виде (факты), а частично в неявном (правила). Встроенные предикаты assert и retract дают возможность корректировать эту базу данных в процессе выполнения программ.
% программа о погоде
хорошая:-
солнечно,
not дождь.
необычная :-
солнечно,
дождь.
отвратительная :-
дождь,
туман.
дождь.
туман.
?- хорошая.
no
?- отвратительная.
yes
?- retract(туман).
yes
?- отвратительная.
no
?- assert(солнечно).
yes
?- необычная.
yes
?- retract(дождь).
yes
?- хорошая.
yes