Лабораторная работа

ДИНАМИЧЕСКИЕ БАЗЫ ДАННЫХ (продолжение)

Цель работы – овладеть приемами создания и ведения реляционных баз данных на Прологе.

Задание. Разработать программу, реализующую компьютерный вариант телефонного справочника. В программе должны быть реализованы следующие операции:

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.  Представить полный листинг программы.