logo search
TurboProlog / Документация / TOM_1

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

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

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

ных с помощью предиката 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).