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

Использование внутреннего указателя b-дерева.

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

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

Когда вы обращаетесь к предикату key_next, имея указатель на последнем

ключе, то указатель будет помещен за пределами дерева. Всегда, когда ука-

затель переместится за пределы дерева, key-current завершается неудачно.

Если же это ограничение неприемлемо, то можете определить другие предика-

ты.

Вы можете использовать предикаты mykey_next, mykey_prev и

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

B-дерева (если таm есть хоть какие-то ключи).

predicates

mykey_next(db_selector, bt_selector, ref)

mykey_prev(db_selector, bt_selector, ref)

mykey_search(db_selector, bt_selector, string, ref)

clauses

mykey_prev(Dba, Bt_selector, Ref) :-

key_prev(Dba, Bt_selector, Ref), !.

mykey_prev(Dba, Bt_selector, Ref) :-

key_next(Dba, Bt_selector, Ref), fail.

mykey_next(Dba, Bt_selector, Ref) :-

key_next(Dba, Bt_selector, Ref), !.

mykey_next(Dba, Bt_selector, Ref) :-

key_prev(Dba, Bt_selector, Ref), fail.

mykey_search(Dba, Bt_selector, Key, Ref) :-

key_search(Dba, Bt_selector, Key, Ref), !.

mykey_search(Dba, Bt_selector, _, Ref) :-

key_current(Dba, Bt_selector, _, Ref), !.

mykey_search(Dba, Bt_selector, _, Ref) :-

key_last(Dba, Bt_selector, Ref).

Вы можете использовать предикаты samekey_next и samekey_prev, опре-

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

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

predicates

samekey_next(db_selector, bt_selector, ref)

try_next(db_selector, bt_selector, ref, string)

samekey_prev(db_selector, bt_selector, ref)

try_prev(db_selector, bt_selector, ref, string)

clauses

samekey_next(Dba, Bt_selector, Ref) :-

key_current(Dba, Bt_selector, OldKey, _),

try_next(Dba, Bt_selector, Ref, Oldkey).

try_next(Dba, Bt_selector, Ref, Oldkey) :-

key_next(Dba, Bt_selector, Ref),

key_current(Dba, Bt_selector, NewKey, _),

NewKey = OldKey, !.

try_next(Dba, Bt_selector, _, _) :-

key_prev(Dba, Bt_selector, _),

fail.

samekey_prev(Dba, Bt_selector, Ref) :-

key_current(Dba, Bt_selector, OldKey, _),

try_prev(Dba, Bt_selector, Ref, Oldkey).

try_prev(Dba, Bt_selector, Ref, Oldkey) :-

key_prev(Dba, Bt_selector, Ref),

key_current(Dba, Bt_selector, NewKey, _),

NewKey = OldKey, !.

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

key_next(Dba, Bt_selector, _),

fail.

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