- •Белорусский национальный технический университет
- •Функциональное и логическое программирование
- •Лабораторная работа 1. Основы работы с Visual Prolog в режиме Test Goal.
- •Лабораторная работа 2. Составление простейшей пролог-программы.
- •2. Краткие справочные данные.
- •Лабораторная работа 3. Формирование правил.
- •2. Краткие справочные данные.
- •3. Содержание задания по лабораторной работе.
- •4. Содержание отчета.
- •Лабораторная работа 4. Рекурсия.
- •3. Содержание задания по лабораторной работе.
- •4. Задачи на рекурсию.
- •5. Содержание отчета.
- •Лабораторная работа 5. Использование отсечения в пролог-программах.
- •2. Краткие справочные данные.
- •Содержание задания по лабораторной работе.
- •4. Содержание отчета.
- •Лабораторная работа 6. Работа со списками.
- •5. Содержание отчета.
- •Лабораторная работа 7. Работа со строками.
- •Лабораторная работа 8. Использование составных объектов.
- •[Член_семьи(“Инна”,”Иванова”,дата(20,март,1971), работа(студент,45)),
- •Лабораторная работа 9. Работа с файлами.
- •Лабораторная работа 10. Построение меню.
- •Лабораторная работа 11. Динамические базы данных.
- •Лабораторная работа 12. Внешние базы данных.
- •Содержание задания по лабораторной работе.
- •Содержание отчета:
- •Содержание задания по лабораторной работе.
- •Содержание отчета:
- •Лабораторная работа 14. Рекурсивное объявление доменов.
- •Краткие справочные данные.
- •Текст Пролог-программы
- •Содержание задания по лабораторной работе.
- •Содержание отчета:
- •Лабораторная работа 15. Основы работы в среде визуального программирования visual prolog.
- •Содержание задания по лабораторной работе.
- •Лабораторная работа 16. Система программирования mulisp.
- •Содержание задания по лабораторной работе.
- •Лабораторная работа 17. Определение функций в lisp.
- •2. Краткие справочные данные.
- •Представление данных в Лисп.
- •Содержание задания по лабораторной работе.
- •Литература
- •Приложение
- •Содержание
Лабораторная работа 12. Внешние базы данных.
Цель работы: приобретение практических навыков составления и отладки программ, работающих с внешней БД.
Краткие справочные данные.
Visual Prolog наряду с внутренними базами данных (лаб. раб. 11) поддерживает внешние БД. Внешняя БД обычно создается в случае, если объем данных больше свободной части ОЗУ или предполагается значительное расширение БД. В отличие от внутренней БД во внешней БД термы могут храниться не только в виде структуры, похожей на факт, но и в виде списков, сложных структур, чисел и т.д.
Внешняя БД состоит из цепочек (chain), в которых хранятся термы. Количество термов в цепочке не ограничено, в БД может быть любое число цепочек. Каждая цепочка имеет свое имя (типа symbol) и может быть обработана как отдельная группа данных. Вся внешняя БД в целом также легко управляема как отдельный модуль.
Объявление внешней БД:
domains
db_selector=<ИмяБД1>;<ИмяБД2>…
Предикаты для работы со всей внешней БД
Создание новой (пустой) БД
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, считается открытой.
Открытие ранее созданной БД
db_open (ИмяБД, ИмяФайла, Место) (db_selector, string, symbol):(i,i,i)
Копирование БД в другое место (напр., из файла в ОЗУ или наоборот)
db_copy (ИмяБД, ИмяФайла, Новое_место)(db_selector, string, symbol):(i,i,i)
Закрытие БД (в конце работы)
db_close (ИмяБД)(db_selector):(i)
Удаление БД
db_delete (ИмяФайла, Место)(string, symbol):(i,i)
Открытие БД, помеченной как ошибочная
db_openinvalid( ИмяБД, ИмяФайла, Место)(db_selector, string, symbol):(i,i,i)
Получение информации о БД
db_statistics(ИмяБД, Количество_термов, Объем_ОП_под_таблицами_БД, Объем_
памяти_занятой_термами_и_указателями,Свободная_память)(db_selector,real, real,real,real):(:(i,o,o,o,o)
Определение имен цепочек во внешней БД
db_ chains( ИмяБД, Цепь)(db_selector, symbol):(i,o)
Повышение надежности БД на диске (таблицы БД записываются на диск)
db_flush(ИмяБД)(db_selector):(i)
Определение имен В+деревьев внешней БД
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 и осуществляется переход к следующей цепочке, из которой будут извлекаться все термы и т.д. до конца внешней БД.
