Скачиваний:
201
Добавлен:
17.06.2016
Размер:
2.69 Mб
Скачать

Обновление внутренней базы данных

Для того, чтобы ввести в программу факты, существует три основных

способа:

- включение фактов в состав вашей секции clauses;

- во время выполнения программы с помощью пердикатов asserta и

assertz;

- путем загрузки файла с фактами базы данных с помощью предиката

consult.

Все стандартные предикаты Турбо Пролога: asserta, assertz, retract,

retractall, consult и save могут иметь один или два агрумента. Необяза-

тельный второй аргумент представляет собой имя внутренней базы данных. Мы

опишем эти предикаты далее. Обозначение "/1" и "/2" после каждого имени

предиката указывает необходимое число аргументов для данной версии преди-

ката. Комментарии после форматов (такие как /* (i) */ и /* (o,i) */ ) по-

казывают поток параметров для этого предиката.

Занесение фактов во время исполнения

Предикат asserta вставляет новый факт в базу данных перед имеющимися

фактами для данного предиката, а assertz вставляет факты после данного

предиката.

Добавление фактов имеет следующий формат:

asserta(<факт>) /* (i) */

asserta(<факт>,databaseName) /* (i,i) */

assertz(<факт>) /* (i) */

assertz(<факт>,databaseName) /* (i,i) */

Поскольку имена предикатов базы данных уникальны внутри программы

или модуля, для предикатов asserta и assertz всегда известно, куда нужно

добавлять факт. Однако, для того, чтобы обеспечить работу с правильной

базой данных, в целях проверки типа можно использовать необязательный

второй аргумент.

Использование предиката assert имеет действие аналогичное использо-

ванию assertz.

Первый предикат следующего примера вставит факт о Suzanne, описанный

предикатом person, после всех фактов person, хранящихся в текущий момент

в памяти. Второй вставит факт о Michael перед всеми имеющимися фактами

предиката person. Третий - вставит факт о John после всех других фактов

likes в базе данных likesDatabase, а четвертый - вставит факт о Shannon в

той же базе данных перед всеми другими фактами likes.

assertz(person("Suzanne", "New Haven", 35)).

asserta(person("Michael", "New York", 26)).

assertz(likes("John", "money"),likesDatabase).

asserta(likes("Shannon", "hard work"),likesDatabase).

После вызова этих предикатов база данных в памяти с произвольным об-

ращением будет выглядеть так, как будто вы начали работу со следующими

фактами:

/* Внутренняя база данных - dbasedom */

person("Michael", "New York", 26).

/* ... другие факты person ... */

person("Suzanne", "New Haven", 35).

/* Внутренняя база данных - likesDatabase */

likes("John", "money")

/* ... другие факты likes ... */

likes("Shannon", "hard work")

Удаление фактов во время выполнения программы

Предикат retract удаляет первый факт в вашей базе данных, который

совпадает с фактом <факт>. Этот предикат является неопределенным. При по-

иске с возвратом предикат retract возвращает альтернативные решения и

удаляет все совпадающие факты, пока они имеются, после чего он не находит

нужных фактов. Предикат retract имеет следующий формат:

retract(<факт>[, databaseName]) /* (i,i) */

Предположим в вашей программе имеются следующие секции database:

database

person(string, string, integer)

database - likesDatabase

likes(string, string)

dislikes(string, string)

clauses

/* база данных */

person("Fred", "Capitola",35)

person("Fred", "Omaha",37)

person("Michael", "Brooklin",26)

/* база данных - likesDatabase */

likes("John", "money")

likes("Jane", "money")

likes("Chris", "chocolate")

likes("John", "broccoli")

dislikes("Fred", "broccoli").

dislikes("Michael", "beer").

Имея такие секции database, Турбо Прологу можно задать следующие це-

ли:

retract(person("Fred", _, _)). /* 1 */

retract(likes( _,"broccoli")). /* 2 */

retract(likes( _, "money"),likesDatabase). /* 3 */

retract(person("Fred", _, _),likesDatabase). /* 4 */

Первая цель удалит первый факт person о Fred из базы данных dbasedom

(имя которой задается по умолчанию). С помощью второй цели из базы данных

likesDatabase будет удален первый факт, совпадающий с likes(X,

"broccoli"). При этом, Турбо Пролог знает из какой базы производить уда-

ление, поскольку имена предикатов базы данных уникальны: предикат person

находится только в неименованной базе данных, а likes только в базе

likesDatabase.

Третья и четвертая цель показывают, как вы можете использовать для

проверки типа второй аргумент. Третья цель успешно реализуется, удаляя

первый факт, совпадающий с likes(,"money") из likesDatabase, а четвертая

цель выдаст ошибку, потому что нет (и не может быть) факта person в базе

данных likesDatabase. Сообщение об ошибке выглядит следующим образом:

506 Type Error: The functor does not belong to the domain

(функтор не относится к даннму домену)

Следующая цель иллюстрирует, как вы можете получить значения из пре-

диката retract:

goal

retract(person(Name, Age)),

write(Name, ", ", Age),

fail.

Вы можете также удалить все факты из заданной секции database с по-

мощью предиката retract. Если при вызове retract в качестве первого аргу-

мента будет указана свободная переменная, то чтобы определить, из какой

секции database нужно произвести удаление, он будет анализировать второй

аргумент. Например:

goal

retract(X, mydatabase),

write(X),

fail.

Соседние файлы в папке Документация