Использование предикатов "var" и "nonvar"

Если воспользоваться предикатами "var" и "nonvar", то можно составить процедуру, выполняющую функции интерфейса для базы данных "возраст". Эта процедура накладывает ограничение, обеспечивающее целостность отношения, вида многие-к-одному во время выборки информации.

% Многие Один

возраст (бранен, 18).

возраст (майк, 17).

возраст (стив, 18).

% Возраст с ограничением многие-к-одному

мо_возраст (Имя, Возраст): - % (1)

nonvar (Имя),

возраст (Имя, Возраст),!. % сократить

мо_возраст (Имя, Возраст): - % (2)

var (Имя),

возраст (Имя, Возраст). % нет "сократить".

Если аргумент "Имя" в запросе к процедуре "мо_возраст" конкретизирован, то ответ на запрос будет получен по правилу (1). Предикат "сократить", расположенный в этом правиле после подцели "возраст", обеспечивает устранение бесполезных затрат времени на поиск еще одного значения возраста после определения первого значения этого параметра. С другой стороны, если аргумент "Имя" не конкретизирован, то ответ на запрос будет выдаваться в соответствии с правилом (2). В правиле (2) предикат "сократить" отсутствует, поэтому запрос может осуществить поиск с возвратом по всей базе данных "возраст". Проиллюстрируем это примерами.

|? - мо_возраст (бранен, X).

Х = 18, % ответ по правилу (1)

нет

|? - мо_возраст (Кто, 18).

Кто = брайен; % ответы по правилу (2) -

Кто = стив;

нет

Теперь можно написать новую версию процедуры "регистрация", которая получит название "регистрация 5". В ней используется процедура "мо_возраст". Запрос к процедуре "регистрация 5" всегда будет приводить к выдаче полного множества ответов без потери времени на бессмысленный поиск дополнительных значений возраста одного и того же лица. Применение процедуры "мо_возраст" позволяет сохранить модульность и базы данных "возраст", и процедуры "регистрация 5".

регистрация 5 (X): -

мужчина (X), мо_возраст (X, Y), Y=18.

|? - регистрация 5 (X).

X = брайен;

Х = стив;

Нет

3. 7. Действия с текущей программой

Существует ряд встроенных предикатов, позволяющих программными средствами изменять текущее множество фраз программы.

assert (X) Предикат "assert" ("принять") добавляет к текущей программе фразу X.

Пример:

|? - assert (король (людовик, франция)).

да

|? - король (людовик, X).

Х = Франция

asserta (X) Предикат "asserta" добавляет к текущей программе фразу Х как первую фразу процедуры.

assertz (X) Предикат "assertz" добавляет в текущую программу фразу Х как последнюю фразу процедуры.

retract (C) Предикат "retract" ("удалить") удаляет из текущей программы первую фразу, которая унифицируется с С. Предупреждение: предикат "retract" является средством деструктивного присваивания фраз, и пользоваться им следует с осторожностью.

Пример:

|? - retract (король (людовик, франция)).

да

|? — король (людовик, X).

нет

Изменение значения факта

Напишем короткую программу, в которой употребляются предикаты "assert" и "retract" для деструктивного присваивания значения факта, содержащего текущее время (в часах).

время (10).

изменить_время: —

время (Час), Нов_час is Час+ 1,

retract (время (Час)),

assert (время (Нов_час)).

При каждом запросе к процедуре "изменить—время" текущее время увеличивается на один час:

|? - изменить_время.

да

|? — время (X).

Х=11

|? -изменить_время.

да

|? — время (X).

Х=12

Соседние файлы в папке Гл.0,1,2,3,4,5,Предисловие