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

Обзор: что такое внешние базы данных?

Внешняя база данных Турбо Пролога состоит из двух компонентов: еди-

ниц данных, т.е. термов Турбо Пролога, сгруппированных в цепочки, и соот-

ветствующих B-деревьев, которые используются для быстрого доступа к дан-

ным.

Внешние базы данных запоминают данные в цепочках (а не по отдельнос-

ти), т.е. взаимосвязанные данные запоминаются совместно. Например, одна

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

содержит имена покупателей. Простые операции с базами данных, такие, как

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

менения B-деревьев. Они становятся важными при сортировке базы данных и

поиске данного элемента. Эти деревья подробно описаны в этой главе ниже.

Соглашения об именовании.

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

ются следующим соглашениям:

- первая часть имени (db_, chain_, term_ и т.д.) идентифицирует

то, что вы должны определить как входные данные;

- вторая часть имени (flush, btrees, delete и т.д.) указывает

на производимое действие или выходное данное.

Например, с помощью db_delete удаляется база данных, с помощью

chain_delete удаляется цепь, а term_delete удаляет терм.

Селекторы внешних баз данных.

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

ременно в памяти, на диске или в EMS-памяти. Используя такую гибкость,

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

мисс между быстродействием и памятью.

Для указания различия между несколькими открытыми базами данных ис-

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

ных. Эти селекторы определяются доменом, называемым db_selector. Он рабо-

тает аналогично домену file в системе файлов. Например, следующие объяв-

ление домена объявляет customers и parts селекторами внешних баз данных:

domains

db_selector=customers; parts

Цепи.

Внешняя база данных является набором термов Турбо Пролога, примером

термов могут быть величины домена integer, real, string, symbol и состав-

ные объекты, например: 32, -194, 3.1417, "Wally", wages, book(dickeus,

"Wally goes to the zoo").

Внутри базы данные запоминаются в виде цепочек. Цепочка может содер-

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

чество цепочек. Каждая цепочка идентифицируется именем, представляющим

собой просто строку.

Отношения и таблицы базы данных моделируются с помощью цепочек тер-

мов. Например, пусть мы имеем поставщика, покупателя и базу данных о то-

варах. Пусть мы хотим поместить эти данные в одной базе с тремя отношени-

ями: одно для покупателей, одно для поставщиков и одно для товаров. Это

можно сделать, поместив всех покупателей в цепочку, названную "покупате-

ли", всех поставщиков в цепочку, названную "поставщики" и все товары в

цепочку, названную "товары".

Для включения терма во внешнюю базу данных его необходимо включить в

поименованную цепочку. С другой стороны, вы можете производить поиск фак-

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

ны указать домен, которому принадлежит терм. На практике, лучше, если все

термы в цепочке имеют один и тот же домен, но нет ограничений на то, как

данные располагаются в базе данных. Ваше дело обеспечивать, чтобы терм,

который вы ищите, принадлежал к тому же домену, что и терм, который вы

вставили в базу.

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

dba1 и dba2. В этом примере все данные о покупателях хранятся в dba1, а

все данные о товарах - в dba2. Теперь просмотрите этот пример; нам необ-

ходимо представить значительно больше информации, прежде чем объяснять,

что здесь происходит.

/*

CH15EX01.PRO - Создание двух цепочечных баз данных

*/

domains

db_selector = dba1 ; dba2

customers = customer(customer_name, address)

parts = part(part_name, ID, customer_name)

customer_name, part_name = symbol

ID = integer

address = string

predicates

access

goal

% создание базы данных dba1 и dba2

db_create(dba1, "dd1", in_memory),

db_create(dba2, "dd1.bin", in_file),

% вставка факта customer в цепочку chain1 в dba1

chain_insertz(dba1, chain1, customers,

customer("Joe Fraser","123 West Side"), _),

chain_insertz(dba1, chain1, customers,

customer("John Smith","31 East Side"), _),

chain_insertz(dba1, chain1, customers,

customer("Diver Dan","1 Water Way"), _),

chain_insertz(dba1, chain1, customers,

customer("Dave Devine","123 Heaven Street"), _),

% вставка факта parts в цепочку chain2 в dba2

chain_insertz(dba2, chain2, parts,

part("wrench", 231, "John Smith"), _),

chain_insertz(dba2, chain2, parts,

part("knife", 331, "Diver Dan"), _),

access,

db_close(dba1), db_close(dba2),

db_delete("dd1", in_memory),

db_delete("dd1.bin", in_file).

clauses

access:-

chain_terms(dba1, chain1, customers,

customer(Name, ADDR), _),

chain_terms(dba2, chain2, parts,

part(Part, Id, Name), _),

write("send ", Part, " part num ",

Id, " to ", Addr), nl,

fail.

access.

Эта программа, прежде всего, создает базы данных dba1 (в памяти) и

dba2 (в файле на диске). Затем в базы данных включаются факты в две це-

почки: chain1 и chain2. После этого программа осуществляет поиск покупа-

теля и товара, заказанного покупателем. Найдя их, программа возвращает

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

закрываются и уничтожаются.

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