Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторный практикум.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
3 Мб
Скачать
☆

Лабораторная работа 12. Внешние базы данных.

  1. Цель работы: приобретение практических навыков составления и отладки программ, работающих с внешней БД.

  1. Краткие справочные данные.

Visual Prolog наряду с внутренними базами данных (лаб. раб. 11) поддерживает внешние БД. Внешняя БД обычно создается в случае, если объем данных больше свободной части ОЗУ или предполагается значительное расширение БД. В отличие от внутренней БД во внешней БД термы могут храниться не только в виде структуры, похожей на факт, но и в виде списков, сложных структур, чисел и т.д.

Внешняя БД состоит из цепочек (chain), в которых хранятся термы. Количество термов в цепочке не ограничено, в БД может быть любое число цепочек. Каждая цепочка имеет свое имя (типа symbol) и может быть обработана как отдельная группа данных. Вся внешняя БД в целом также легко управляема как отдельный модуль.

Объявление внешней БД:

domains

db_selector=<ИмяБД1>;<ИмяБД2>…

Предикаты для работы со всей внешней БД

  1. Создание новой (пустой) БД

db_create (ИмяБД, ИмяФайла, Место)(db_selector, string, symbol):(i,i,i)

Например: db_create (db_name, “f1.dat”, in_file)

db_create (mydba, “f2.dat”, in_memory)

Третий параметр предиката определяет место расположения внешней БД: in_file (для внешнего файла), in_memory (для RAM), in_EMS (для EMS-памяти).

Внешняя база данных, созданная предикатом db_create, считается открытой.

  1. Открытие ранее созданной БД

db_open (ИмяБД, ИмяФайла, Место) (db_selector, string, symbol):(i,i,i)

  1. Копирование БД в другое место (напр., из файла в ОЗУ или наоборот)

db_copy (ИмяБД, ИмяФайла, Новое_место)(db_selector, string, symbol):(i,i,i)

  1. Закрытие БД (в конце работы)

db_close (ИмяБД)(db_selector):(i)

  1. Удаление БД

db_delete (ИмяФайла, Место)(string, symbol):(i,i)

  1. Открытие БД, помеченной как ошибочная

db_openinvalid( ИмяБД, ИмяФайла, Место)(db_selector, string, symbol):(i,i,i)

  1. Получение информации о БД

db_statistics(ИмяБД, Количество_термов, Объем_ОП_под_таблицами_БД, Объем_

памяти_занятой_термами_и_указателями,Свободная_память)(db_selector,real, real,real,real):(:(i,o,o,o,o)

  1. Определение имен цепочек во внешней БД

db_ chains( ИмяБД, Цепь)(db_selector, symbol):(i,o)

  1. Повышение надежности БД на диске (таблицы БД записываются на диск)

db_flush(ИмяБД)(db_selector):(i)

  1. Определение имен В+деревьев внешней БД

db_btrees(ИмяБД, Имя БДер)(db_selector, string):(i,o)

Предикаты для работы с цепочками

Цепочки термов запоминаются последовательно и одновременно доступна только одна цепочка. Каждая цепочка имеет свое имя, которое нигде специально не объявляется. Цепочка создается, если ее имя впервые встретилось в предикатах записи термов в БД.

Для записи термов во внешнюю БД служат следующие три предиката:

chain_inserta(ИмяБД, Цепь, Дом, Терм, Указ)(db_selector, symbol,<domain>,<term>, ref):(i,i,i,i,o)

chain_insertz(ИмяБД, Цепь, Дом, Терм, Указ)(db_selector, symbol,<domain>,<term>, ref):(i,i,i,i,o)

chain_insertafter(ИмяБД, Цепь, Дом, Указ, Терм, НовУказ) )(db_selector, symbol, <domain>, ref, <term>, ref)::(i,i,i,i,i,o)

ИмяБД – имя, данное внешней БД в предикате db_create;

Цепь – имя цепочки (тип symbol);

Дом – тип (домен) вставляемого терма;

Терм – вставляемый терм;

Указ – указатель на вставляемый терм (тип ref), в третьем предикате – указатель терма, после которого вставляется Терм с указателем НовУказ.

Указатели относятся к специальному, определенному в системе типу данных ref.

Предикаты chain_inserta и chain_insertz аналогичны по функциям встроенным предикатам asserta и assertz. Предикат chain_insertafter служит для вставки терма между термами, уже занесенными в БД.

Удаление цепочки: chain_delete( ИмяБД, Цепь) (db_selector, symbol):(i,i)

Предикаты

chain_first( ИмяБД, Цепь, Указ_на_первый_терм)(db_selector, symbol, ref):(i,i,o)

chain_last( ИмяБД, Цепь, Ука_на_последний_терм)(db_selector, symbol, ref):(i,i,o)

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

Извлечение термов из внешней БД осуществляется предикатом

chain_terms( ИмяБД, Цепь, Дом, Терм, Указ)(db_selector, symbol, <domain>, <term>, ref):(i,i,i,o,o) (i,i,i,i,o)

Параметры предиката такие же, как и у chain_inserta и chain_insertz. Отличие в том, что четвертый параметр может быть выходным. При шаблоне (i,i,i,i,o) параметр Терм может быть задан частично, т.е. будут извлекаться из связанного списка не все термы, а только с нужными свойствами.

Предикаты

chain_next( ИмяБД, Цепь, Указ_на_следующий_терм)(db_selector, symbol, ref):(i,i,o)

chain_prev( ИмяБД, Цепь, Указ_на_предыдущий_терм)(db_selector, symbol, ref): (i,i,o)

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

Предикаты для работы с термами

Замена терма

term_replace( ИмяБД, Дом, Указ, Терм) (db_selector,<domain>,ref,<term>): (i,i,i,i)

Заменяет терм с указателем Указ новым термом Терм типа Дом.

Удаление терма

term_delete( ИмяяБД, Цепь, Указ) (db_selector, symbol, ref):(i,i,i)

Извлечение терма из внешней БД

ref_term( ИмяБД, Дом, Указ, Терм) (db_selector,<domain>,ref,<term>)::(i,i,i,o)

Пример программы, читающей термы из внешней БД:

domains

db_selector = mydba % объявление имени внешней БД

dbdom = city(cityname, code);

person(family, name, street, code)

cityname, code, family, name, street = string

predicates

rd( ref ) % извлечение термов из БД

clauses

rd( Ref) :- ref_term( mydba, dbdom, Ref, Term),

write(Term), nl, fail.

rd( Ref) :- chain_next( mydba, Ref, Next), rd( Next).

Rd(_).

goal

db_open( mydba, “dd.dat”, in_file),

db_chains( mydba, Chain),

chain_first( mydba, Chain, Ref),

rd( Ref ).

В приведенном примере извлечение термов из внешней БД происходит в пределах только одной цепочки.

Чтобы извлечь термы всей БД (из всех цепочек), нужно модифицировать правило

rd( Ref ), удалив из него последнее предложение rd(_). В этом случае после извлечения из первой цепочки всех термов происходит возврат к подцели db_chains раздела goal и осуществляется переход к следующей цепочке, из которой будут извлекаться все термы и т.д. до конца внешней БД.