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

Программирование внешних баз данных

В этом параграфе рассмотрено 7 примеров, иллюстрирующих некоторые

общие принципы и методы работы с системой внешних баз данных Турбо Проло-

га. Следующие ниже разделы содержат:

"просмотр базы данных" - показывает способ последовательного

просмотра цепочки или B-деревьев во

внешней базе данных;

"вывод содержания базы данных" - определяет предикат, кото-

рый вы можете использовать для вывода

текущего содержания внешней базы дан-

ных;

"создание защищенной базы данных" - показывает как защищать

базу данных от неожиданного отключения

питания или других возможных аварий;

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

простым дополнение, изменение и защиту

базы данных;

"использование внутренних указателей B-дерева" - снабжает

вас несколькими предикатами для уста-

новки указателя внутри открытого B-де-

рева;

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

старому методу изменения структуры ба-

зы данных.

Просмотр базы данных

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

ты с памятью Турбо Пролога. Каждый раз извлекая терм из внешней базы дан-

ных с помощью предиката ref_term, Турбо Пролог помещает его в общий стек.

Память, занятая этим термом, не освобождается до тех пор, пока программа

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

ката ref_term. Это значит, что для последовательного просмотра базы дан-

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

/* Структура для последовательного просмотра цепочки */

scan(db_selector, Chain, ....) :-

chain_first(db_selector, Chain, Ref),

scanloop(db_selector, Ref).

scanloop(db_selector, Ref) :-

ref_term(db_selector, midom, Ref, Term),

/* ... ваши предикаты ... */

fail.

scanloop(db_selector, _) :-

chain_next(db_selector, Ref, NextRef),

scanloop(db_selector,NextRef).

Для последовательного просмотра каталога следует использовать струк-

туру типа:

/* Структура для последовательного просмотра каталога */

scan(db_selector, Bt_selector) :-

key_first(db_selector, BT_selector, FirstRef),

scanloop(db_selector, Bt_selector, FirstRef).

scanloop(db_selector, Bt_selector, Ref) :-

ref_term(db_selector, midom, Ref, Term),

/* ... ваши предикаты ... */

fail.

scanloop(db_selector, Bt_selector, _) :-

chain_next(db_selector, Bt_selector, NextRef),

scanloop(db_selector,Bt_selector, NextRef).

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

данных с использованием предиката chain_terms:

/* Другой путь последовательного просмотра цепочки */

scan(db_selector, Chain) :-

chain_terms(db_selector, Chain, midom, Term, Ref),

/* ... ваши предикаты ... */

fail.

scan(_,_).

Для просмотра B-дерева вы должны определить и использовать предикат

bt_case. В процессе поиска с возвратом предикат возвращает каждый ключ в

B-дереве и связанный с ним указатель базы данных.

/* Это фрагмент выполняется с программой CH15EX04.PRO */

predicates

bt_keys(db_selector, bt_selector, string, ref)

bt_keysloop(db_selector, bt_selector, string, ref)

clauses

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

key_first(Db_selector, Bt_selector, _),

bt_keysloop(Db_selector, Bt_selector, Key, Ref).

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

key_current(Db_selector, Bt_selector, Key, Ref).

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

key_next(Db_selector, Bt_selector),

bt_keysloop(Db_selector, Bt_selector, Key, Ref).

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