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

Использование внутренней базы данных

Так как Турбо Пролог реализует реляционную базу данных, как совокуп-

ность фактов, его можно использовать как мощный язык запросов к внутрен-

ней базе данных. Стандартный алгоритм Турбо Пролога автоматически выбира-

ет факты с правильными значениями известных параметров и присваивает зна-

чения любым неизвестным параметрам, пока алгоритм поиска с возвратом на

даст все решения для данного запроса.

Турбо Пролог интерпретирует факты, принадлежащим к базе данных, та-

ким же образом, как обычные предикаты. Факты предикатов внутренней базы

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

ные предикаты для достижения максимальной скорости компилируются в двоич-

ный код.

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

Ключевое слово database определяет начало последовательности объяв-

лений предикатов, описывающих внутреннюю базу данных. Во время выполнения

с клавиатуры можно с помощью предикатов asserta и assertz добавлять факты

(но не правила) в базу данных. Вызвав стандартный предикат consult, вы

можете извлечь добавляемые факты из файла на диске. Секция database может

выглядеть так же, как в следующем примере:

domains

name, address = string

age = integer

gender = male; female

database

person(name,address,age,gender)

predicates

male(name,address,age)

female(name,address,age)

child(name,age,gender)

clauses

male(Name,Address,Age) :- person(Name,Address,Age,male).

...

В этом примере вы можете использовать предикат person таким же обра-

зом, как используются другие предикаты (male,female,child). Единственное

отличие состоит в том, что вы можете добавлять и удалять факты для преди-

ката person во время работы программы.

Следует отметить следующее:

1. Вы можете добавлять в базу данных только факты, а не правила.

2. Факты базы не могут содержать свободных переменных.

Информация о том, как обойти эти два ограничения, содержится в при-

ложении "Мета-Программирование" в Справочном руководстве.

Допускается наличие нескольких секций database, но для этого нужно

явно указать имя каждой секции database. Это требуется потому, что

consult и save могут загружать и сохранять определенную секцию database

по имени.

database - mydatabase

myFirstRelation(integer)

mySecondRelation(real, string)

myThirdRelation(string)

/* и т.д. */

goal

consult("example.dba",mydatabase),

retract(myFirstRelation(1)),

asserta(myFirstRelation(0)),

save("example.dba",mydatabase).

Такое описание создает базу данных с именем mydatabase. Если вы не

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

стандартное имя dbasedom (это сделано в основном для сохранения совмести-

мости с Турбо Прологом версии 1.1).

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

уникальными. В двух различных секциях database нельзя использовать одина-

ковые имена предикатов. (Использование модулей поясняется в Справочном

руководстве.)

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