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

Key_first/3, key_last/3 и key_search/4

Каждое B-дерево поддерживает внутренние указатели на свои узлы.

Key_first Key_last позволяют установить указатель на первый или последний

узел в B-дереве соответственно. key_search устанавливает указатель на

данный ключ.

key_first(Dbase,Btree_Sel,Ref) /*(i,i,o)*/

key_last(Dbase,Btree_Sel,Ref) /*(i,i,o)*/

key_search(Dbase,Btree_Sel,Key,Ref) /*(i,i,i,o)*/

key_search завершается успешно, если ключ найден, иначе key_ search

завершается неудачно, но внутренний указатель B-дерева устанавливается на

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

ложен ключ Key. После этого вы можете использовать key_current, чтобы

указать ключ и указатель базы данных на этот ключ.

Key_next/3 и key_prev/3

Эти предикаты используются для перемещения указателя B-дерева вперед

или назад:

key_next(Dbase,Btree_Sel,NextRef) /*(i,i,o)*/

key_prev(Dbase,Btree_Sel,PrevRef) /*(i,i,o)*/

Если указатель находится на одном из концов B-дерева, то попытка пе-

редвинуть указатель завершится неудачно, но указатель B - дерева будет

работать так, как если бы он был помещен на одну позицию вне дерева.

Key_current/4

Предикат key_current возвращает ключ с указателем базы данных, соот-

ветствующий текущему положению указателя B-дерева.

key_current(Dbase,Btree_Sel,Key,Ref) /*(i,i,o,o)*/

key_current завершается неудачно после обращения к предикатам

bt_open, bt_create, key_insert или key_delete, или, если указатель нахо-

дится перед первым или после последнего ключа.

Пример: Доступ к базе данных через b-деревья

Приведенная ниже программа обрабатывает несколько текстовых файлов в

одной базе данных. Вы можете выбрать и отредактировать тексты, как если

бы они находились в разных файлах. Соответствующее B-дерево предназначено

для быстрого доступа к файлам и сортировки их названий.

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

domains

db_selector = dba

predicates

% List all keys in an index

list_keys(db_selector,bt_selector)

clauses

list_keys(dba,Bt_selector):-

key_current(dba,Bt_selector,Key, _),

write(Key,' '),

fail.

list_keys(dba,Bt_selector):-

key_next(dba,Bt_selector, _), !,

list_keys(dba,Bt_selector).

list_keys(_,_).

predicates

open_dbase(bt_selector)

main(db_selector,bt_selector)

ed(db_selector,bt_selector,string)

ed1(db_selector,bt_selector,string)

clauses

% Выполнение цикла до нажатия любой клавиши

main(dba,Bt_select) :-

write("File Name: "),

redln(Name),

ed(dba,Bt_select, Name), !,

main(dba,Bt_select).

main(_,_).

% Предикат ed убеждает, что редактирование не имеет неудач.

ed(dba,Bt_select, Name):-

ed1(dba,Bt_select, Name), !.

ed(_,_,_).

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* Существуют три возможности: *

* *

* a)Если имя пустая строка - просмотреть все имена *

* b)Имя уже существует - изменить содержание файла *

* c)Новое имя - создать новый файл *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */

ed1(dba,Bt_select, ""):-!,

key_first(dba, Bt_select,_),

list_key(dba, Bt_select),

n1.

ed1(dba,Bt_select, Name):-

key_search(dba, Bt_select,Name,Ref),!,

ref_terrm(Dba,String,Ref,Str),

editmsg(Str,Str1,"Edit old",NAME,"",0,"PROLOG.HLP",RET),

clearwindow,

Str><Str1, RET = 0,

term_replace(dba, string, Ref, Str1).

ed1(dba,Bt_select, Name):-

editmsg("",STR1,"Creat New",NAME,"",0,"PROLOG.HLP",RET),

clearwindow,

""><Str1, RET = 0,

chain_insertz(dba, file_chain, string, Str1, Ref),

key_insert(Db_select, Bt_select, Name, Ref).

open_dbase(Index) :-

existfile("dd.dat"),!,

db_open(dba, "dd.dat", in_file),

dt_open(dba,"ndx", Index).

open_dbase(Index) :-

db_create(dba, "dd.dat", in_file),

dt_create(dba,"ndx", Index, 20, 4).

goal

open_dbase(Index),

main(dba, Index),

bt_close(dba, Index),

db_close(dba).

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