Лабораторная работа
ДИНАМИЧЕСКИЕ БАЗЫ ДАННЫХ (продолжение)
Цель работы – овладеть приемами создания и ведения реляционных баз данных на Прологе.
Задание. Разработать программу, реализующую компьютерный вариант телефонного справочника. В программе должны быть реализованы следующие операции:
1. Получение информации о телефонном номере по фамилии человека.
2. Получение информации о фамилии абонента по телефонному номеру.
3. Добавление новой записи в телефонную базу.
4. Изменение существующей в телефонной базе записи.
5. Удаление записи из телефонной базы.
При разработке программы учесть следующее:
1. Внутренняя база данных должна содержать факты, описывающие единственный предикат, имеющий два аргумента. Первым аргументом предиката будет фамилия человека, а вторым — его телефонный номер. Примечание. Каждой фамилии соответствует не более одного телефонного номера, и наоборот.
2. При запуске программы появляется меню, в котором указаны действия по работе с базой данных (см. выше). При работе с меню необходимо учесть, что:
1) пользователь может ошибиться и нажать клавишу, не соответствующую ни одной из пяти указанных операций;
2) после выполнения каждой из операций программа должна вернуться обратно в меню, чтобы не запускать программу заново для выполнения других действий с базой данных;
3) выход из программы должен происходить без выполнения действий и при этом факты телефонной базы должны быть сохранены из оперативной памяти в файл на диске, а оперативная память очищена от ненужных фактов.
Указания к выполнению задания.
Введем следующие описания.
DOMAINS
name, number = String /* фамилия и тел. номер будут храниться в виде строк*/
file=f /*файловый домен будет использоваться для считывания с диска и записи на диск телефонной базы */
DATABASE
phone(name, number) /* описание предиката внутренней базы данных */
PREDICATES
name_phone(name, number) /* предикат для нахождения номера телефона по фамилии*/
phone_name(name, number) /* предикат для нахождения фамилии по номеру телефона*/
process(char) /*предикат для реализации выполнения соответствующего пункта меню*/
menu /* предикат для реализации вывода меню и обработки выбора пункта меню*/
start /* этот предикат проверяет наличие файла с телефонной базой на диске и, если такой файл существует, загружает факты из нее во внутреннюю базу данных, а если его не было, то создает этот файл*/
Рассмотрим правила, реализующие ряд вышеприведенных требований к программе.
1) Организация меню.
menu:– clearwindow, /* очистка текущего окна */
write("1– Получение телефонного номера по фамилии "),nl,
write("2 — Получение фамилии абонента по номеру телефона "),nl,
write("3 — Добавление новой записи в телефонную базу."),nl,
write("4 — Изменение номера абонента"),nl,
write("5 — Удаление записи из телефонной базы"),nl,
write("0 — Выход из программы"),nl,
readchar(C), /* читаем символ с клавиатуры */
process(C). /* вызываем выполнение соответствующего пункта меню */
2) При ошибочном нажатии клавиши срабатывает следующее правило:
process (_):– menu. /* отображается меню еще раз */
3) При выборе первого пункта меню, должен быть выдан телефонный номер абонента (если в телефонной базе имеется соответствующий факт) или сообщение о том, что в телефонной базе нет такой информации.
process ('1'):–
write("Введите фамилию"), nl,
readln(Name),
name_phone(Name, Phone), /* вызывается предикат, который помещает
в переменную Phone телефонный номер,
соответствующий фамилии Name или сообщение
об отсутствии информации */
write("Номер телефона: ",Phone),
readchar(_), /* ожидание нажатия любой клавиши */
menu. /* возвращаемся в меню */
name_phone(Name, Phone):–
phone(Name, Phone),!.
name_phone(_,"Нет информации о телефонном номере").
/* если нужного факта во внутренней базе данных
не нашлось, то выводится сообщение об его отсутствии */
4) При выборе третьего пункта меню, нужно ввести фамилию и номер абонента, после чего добавить соответствующий факт в базу данных.
process ('3'):–
write("Введите фамилию"),nl,
readln(Name),
write("Введите номер телефона"),nl,
readln(Phone),
assert(phone(Name, Phone)), /*добавление факта во внутреннюю бд*/
menu.
5) При выборе четвертого пункта меню, нужно ввести фамилию абонента и его новый телефонный номер, после чего удалить устаревшую информацию из телефонной базы (с помощью предиката retract) и добавить туда новую информацию (используя встроенный предикат assert).
process ('4'):–
clearwindow,
write("Введите фамилию"),nl,
readln(Name),
write("Введите новый номер телефона"),nl,
readln(Phone),
retract(phone(Name,_)), /* удаление прежней информации из
внутренней базы данных */
assert(phone(Name, Phone)), /* добавление новой информации
в телефонную базу */
menu.
6) Выход из программы.
process ('0'):–
save("phones. ddb "), /* сохранение телефонной базы в файл */
retractall(_)./* удаление всех фактов из внутренней бд*/
7) В начале работы программы факты из телефонной базы, хранящейся в файле на диске, должны загружаться во внутреннюю базу данных, в случае, если такой файл существует. Для начала работы программы введем предикат start.
Примечание. Предикат existfile проверяет существование файла с указанным именем.
start:–
existfile("phones. ddb"),!,
consult("phones. ddb "), /* загрузка фактов во внутреннюю бд*/
menu.
start:–
menu. /* если файла еще нет, просто вызывается меню */
1. Описать предикаты для выполнения второго и пятого пунктов меню.
2. Представить полный листинг программы.



