Логическое программирование

       

Доступ к программам и обработка программ


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



Содержание раздела