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

Использование key-search с дублируемыми ключами

Дублируемые ключи часто называют дуплетами. При поиске ключа в B-де-

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

вым из дуплета. Это означает, что предикат key_prev иногда может вернуть

тот же ключ, что и предикат key_search. Если Турбо Пролог гарантирует,

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

key_search станет очень медленным во всех деревьях. Чтобы найти первый из

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

key_search:

predicates

keysearch_dupl(db_selector, bt_selector, string, ref)

first_dupl(db_selector, bt_selector, string, ref, ref)

try_prev(db_selector, bt_selector, ref, string)

clauses

keysearch_dupl(Db_selector, Bt_selector, Key, Ref) :-

key_search(Db_selector, Bt_selector, Key, Relf),

first_dupl(Db_selector, Bt_selector, Key, Refl, Ref).

first_dupl(Db_selector, Bt_selector, Key, _, Ref) :-

try_prev(Db_selector, Bt_selector, Ref, Key), !,

first_dupl(Db_selector, Bt_selector, Key, Relf, Ref).

first_dupl(_, _, _, Ref, Ref).

try_prev(Db_selector, Bt_selector, Ref, OldKey) :-

key_prev(Db_selector, Bt_selector, Ref),

key_current(Db_selector, Bt_selector, NewKey, _),

NewKey=OldKey, !.

try_prev(Db_selector, Bt_selector, _, _,) :-

key_next(Db_selector, Bt_selector, _),

fail.

Изменение структуры базы данных.

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

ние старой базы данных в новую с внесением изменений. Другой путь, опи-

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

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

данных обратно в обновленном виде.

Предикат dumpdba, описанный ниже, предназначен для выгрузки базы

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

ям:

- каждая цепочка в базе данных моделирует отношение;

- все элементы базы данных принадлежат одному домену;

Эта методика не требует выгрузки B-деревьев в текстовый файл, мы

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

но из отношений. В этом примере все термы принадлежат родовому домену

mydom, в момент применения можно заменить mydom на требуемое имя домена и

соответствующее его объявление.

Эта программа записывает содержание базы данных в текстовый файл,

открытый предикатом outfile.

Каждая строка текстового файла содержит терм и имя содержащей его

цепочки. Имена цепочки и терма записываются в сложный объект домена

chainterm.

/* Программа CH1SEX06.PRO */

domains

db_selector = myDba

chainterm = chain(string, mydom)

file = outfile

mydom = city(zipcodf, cityname);

person(firstname, lastname, street, zipcode, code)

zipcode, cityname, firstname, lastname = string

street, code = string

predicates

wr(chainterm)

dumpDva(string,string)

clauses

wr(X) :-write(X), nl.

dumpDva(Db_selector, OutFile) :-

db_open(myDba, Db_selector, in_file),

openwrite(outfile, OutFile),

writedevice(outfile),

db_chains(myDba, Chain),

chain_terms(myDba, Chain, mydom, Term, _),

wr(chain(Chain, Term)),

fail.

dumpDva(_, _) :-

closefile(outfile),

db_close(myDba).

goal

dumpDva("\\programs\\register.bin", "register.txt").

Используя приведенную выше программу, можно сгенерировать текстовый

файл. И вы можете перегрузить базу данных, используя предикат readterm

для домена chainterm. Предикат dba_insert, определенный в разделе "Обнов-

ление базы данных", производит это обновление.

domains

chainterm = chain(string, dbdom)

predicates

nondeterm repfile(file)

copyDba

loadDba(string)

clauses

repfile(_).

repfile(File) :- not(eof(File)),repfile(File).

loadDba(OutFile) :-

openread(Prn_file, OutFile),

readdevice(Prn_file),

repfile(Prn_file),

readterm(Chainterm, chain(Chain, Term)),

write(Term),nl,

Dba_insekt(Chain, Term),

file.

loadDba(_) :-

closefile(Prn_file).

copyDba :-

createDba,

db_open(Dba, "redister.bin", in_file),

open_indices,

loadDba("redister.txt"),

db_close(Dba).

Обзор

Система внешней базы данных Турбо Пролога добавляет силу, скорость и

эффективность к применению вашей базы данных. Основные вопросы, затрону-

тые в этой главе:

1) Термы внешней базы данных запоминаются в цепочках, к которым

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

ных; эти указатели принадлежат к предопределенному домену ref.

2) Индивидуальность баз данных идентифицируется селекторами ба-

зы данных, принадлежащими к стандартному домену db_selector.

3) Вы можете хранить базу данных в трех местах, в зависимости

от аргумента, принадлежащего к предопределенному домену place.

a) in_file помещает базу данных в файл на диске.

б) in_memory помещает ее в оперативную память.

в) in_ems помещает ее в память EMS-типа.

4) Если вы хотите сортировать термы в базе данных, то следует

использовать B-деревья. Как и базы данных, B-деревья обознача-

ются селекторами, принадлежащими к стандартному домену bt

_selector.

5) Каждый вход в узел B-дерева содержит строку key (ключ) (так-

же называемую index), которая идентифицирует запись, и указа-

тель базы данных, который связан с этой записью.

6) Ключи B-дерева сгруппированы в страницы, и число ключей, со-

держащихся в одном узле, определяется порядком (order) дерева.

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