
- •27. Управление программой. Внутренние подпрограммы унификации Пролога.
- •28. Структура программ на Прологе. Предикаты и утверждения.
- •29. Арифметика в Прологе.
- •30. Программирование повторяющихся операций. Повторение и откат.
- •31. Методы повторения. Методы организации рекурсии.
- •32. Списки в Прологе. Применение списков в программе.
- •34. Использование метода с разделением списка на голову и хвост. Компоновка данных в список.
- •34. Присваивание переменным строковых значений. Конкатенация строк. Преобразование данных.
- •35 Создание символьных префиксов. Преобразование строк в список символов.
- •38. Преобразование строк в списки атомов с функторами.
- •39.Предикаты Пролога для работы с файлами. Использование предикатов для работы с файлами.
- •40. Программы для обработки файлов.
- •41. Дозапись данных в файл
- •42. Использование файлов прямого доступа
- •43. Использование предикатов для работы с окнами. Использование окон для ввода вывода.
- •44. Использование графики в программе. Использование графики черепашки.
- •45.Использование звук и музыки.
- •46.Базы данных в Прологе. Предикаты динамической базы данных в Прологе.
- •47. Создание базы данных, располагающейся в оперативной памяти.
- •48. Создание базы данных, располагающейся на диске
- •49. Принципы построения экспертных систем
- •50.Методы вывода и система пользовательского интерфейса эс.
- •51.Экспертные системы, базирующиеся на правилах.
- •52.Экспертные системы, базирующиеся на логике.
48. Создание базы данных, располагающейся на диске
Более жизнеспособными являются СУБД, хранящие данные на
диске (нерезидентные). Так как объем внешней памяти сущест-
венно больше объема оперативной памяти, системы такого класса
пригодны для большинства практических задач.
Важной особенностью программы должно явиться обеспечение
эффективного доступа к базе. Это требование заставляет ис-
пользовать индексные файлы.
Данные в нашем примере требуют введения предиката такой
структуры:
team(name, school, city, state, color, stadium, coach,
year, team_power, offensive_power,
defensive_power, winning_power, home_power)
Предикат объявляется в разделе программы database. Не-
обходимо также описать (в разделе domains) объекты этого
предиката. В дополнение к ним нужно ввести два терма, обоз-
начающие файл БД и служебный индексный файл;
В результате раздел domains приобретает следующий вид:
domains
file = datafile ;
indexfile
name, school, city, state, color,
stadium, coach = string
year,team_power, offensive_power,
defensive_power, winning_power, home_power = integer
Очередной стадией проектирования программы является
описание предикатов, осуществляющих различные операции над
базой, в разделе predicates:
do_dbase /* цель */
menu /* интерфейс в виде меню */
process /* различные операции из перечня меню */
Дополнительно к ним надо ввести вспомогательные модули,
ответственные за операции ввода-вывода: добавление, удаление
и вывод данных.
predicates
repeat
menu
process(integer)
do_dbase
dbassert(dbasedom) /* добавление данных */
dbass(dbasedom,string,string)
dbretract(dbasedom) /* удаление данных */
dbret(dbasedom,string,string)
dbret1(dbasedom,real)
dbread(dbasedom) /* чтение данных */
dbrd(dbasedom,string,string)
dbaaccess(dbasedom,real)
Так же, как и предыдущая программа, do_dbase вызывает
модуль menu. В свою очередь menu вызывает один из модулей
process; который именно из них вызывается, зависит от значе-
ния введенного пользователем числа. Структура модулей
do_dbase и menu остается такой же, какой она была в программе
"Футбольная база данных". Модули process похожи на одноимен-
ные модули той же программы, с немногочисленными отличиями:
1) process(1) вызывает вспомогательный модуль dbassert,
предназначенный для засылки данных в базу на диск,
2) process(2) вызывает вспомогательный модуль dbretract,
который удаляет данные из базы на диске,
3) process(3) вызывает вспомогательный модуль dbread, осу-
ществляющий выборку данных для выдачи их на экран.
Каждое из трех правил вызывает свой модуль, выполняющий
заданную работу. Отметим, что в этих правилах содержатся
ссылки на файл БД и служебный индексный файл.
Ввод-вывод на диск осуществляется при помощи предикатов,
с которыми вы познакомились в гл.7. Для открытия файла БД
используется предикат openwrite. Используются также предикаты
writedevice, filepos и closefile.
Назначением модуля dbrd является поиск и чтение данных,
содержащихся в БД. Модуль оформлен следующим образом:
dbrd(Term,Indexfile,Datafile) :-
openread(datafile,Datafile),
openread(indexfile,Indexfile),
dbaaccess(Term,-1),
closefile(datafile),
closefile(indexfile).
Как видно из приведенного текста, здесь используется
вспомогательный модуль dbaaccess, осуществляющий поиск и вы-
борку данных из файла БД. Вариант правила, работающий с фай-
лом БД, задается таким выражением:
dbaaccess(Term,Datpos) :-
Datpos >= 0,
filepos(datafile,Datpos,0),
readdevice(datafile),
readterm(dbasedom,Term).
Этот предикат читает данные, логически связанные со зна-
чением индекса, задаваемым переменной Datapos. Соответствую-
щие значение индекса ищется в индексным файле другим вариан-
том dbaaccess:
dbaaccess(Term,_) :-
readdevice(indexfile),
readreal(Datpos1),
dbaaccess(Term,Datpos1).
Это правило пытается найти в базе такую запись, индекс
которой присутствует в индексном файле. Если индекс находит-
ся, по правило успешно; если нет, то неуспешно. В случае ус-
пеха переменная Term получает нужные пользователю значения.