DOMAINS /* раздел описания доменов */
name, number = String /* фамилию абонента и телефонный
номер будем хранить в виде
строк */
file=f /* файловый домен будем использовать для
считывания с диска и записи на диск нашей
телефонной базы */
DATABASE /* раздел описания предикатов внутренней
базы данных */
phone(name, number)
PREDICATES /* раздел описания предикатов */
name_phone(name, number) /* этот предикат находит номер
телефона по фамилии абонента */
phone_name(name, number) /* этот предикат находит фамилию
абонента по номеру телефона */
m(char) /* этот предикат реализует выполнение
соответствующего пункта меню */
menu /* этот предикат реализует вывод меню и
обработку выбора пользователя */
start /* этот предикат проверяет наличие файла
с телефонной базой на диске и либо загружает
факты из нее во внутреннюю базу данных,
если такой файл существует, либо создает
этот файл, если его не было */
CLAUSES /* раздел описания предложений */
name_phone(Name,Phone):–
phone(Name,Phone),!.
name_phone(_,"Нет информации о телефонном номере").
/* если соответствующего факта
во внутренней базе данных не нашлось,
вместо телефонного номера возвращаем
соответствующее сообщение */
phone_name(Name,Phone):–
phone(Name,Phone).
phone_name("Нет информации о владельце телефона",_).
/* если соответствующего факта
во внутренней базе данных не нашлось,
вместо фамилии абонента возвращаем
соответствующее сообщение */
menu:–
clearwindow, /* очистка текущего окна */
write("1– Получение телефонного номера
по фамилии "),nl,
write("2 — Получение фамилии абонента по номеру
телефона "),nl,
write("3 — Добавление новой записи в телефонную
базу."),nl,
write("4 — Изменение номера абонента"),nl,
write("5 — Удаление записи из телефонной базы"),nl,
write("0 — Выйти"),nl,
readchar(C), /* читаем символ с клавиатуры */
m(C). /* вызываем выполнение соответствующего пункта
меню */
m('1'):–
clearwindow,
write("Введите фамлию"), nl,
readln(Name),
name_phone(Name, Phone),
write("Номер телефона: ",Phone),
readchar(_),
menu.
m('2'):–
clearwindow,
write("Введите номер телефона"),nl,
readln(Phone),
phone_name(Name, Phone),
write("Фамилия абонента: ",Name),
readchar(_),
menu.
m('3'):–
clearwindow,
write("Введите фамилию"),nl,
readln(Name),
write("Введите номер телефона"),nl,
readln(Phone),
assert(phone(Name,Phone)),
/* добавляем факт во внутреннюю
базу данных */
menu.
m('4'):–
clearwindow,
write("Введите фамилию"),nl,
readln(Name),
write("Введите новый номер телефона"),nl,
readln(Phone),
retract(phone(Name,_)),
/* удаляем устаревшую информацию
из внутренней базы данных */
assert(phone(Name,Phone)),
/* добавляем новую информацию
в телефонную базу */
menu.
m('5'):–
clearwindow,
write("Укажите номер телефона, запись о котором
нужно удалить из телефонной базы"), nl,
readln(Phone),
retract(phone(_,Phone)), /* удаляем соответствующий
факт из внутренней базы
данных */
menu.
m('0'):–
save("phones.ddb "), /* сохраняем телефонную базу
в файл */
retractall(_)./* удаляем все факты из внутренней
базы данных */
m(_):–
menu. /* если пользователь по ошибке нажал клавишу,
отличную от тех, реакция на которые
предусмотрена, ничего плохого
не произойдет, будет отображено меню
еще раз */
start:–
existfile("phones.ddb"),!, /* если файл с телефонной
базой существует */
consult("phones.ddb "), /* загружаем факты во
внутреннюю базу данных */
menu. /* вызываем меню */
start:–
openwrite(f,"phones.ddb"),
/* если файла с телефонной
базой не существует, создаем
его */
closefile(f),
menu. /* вызываем меню */
GOAL /* раздел внутренней цели*/
Start |
Листинг 13.1. Программа, реализующая компьютерный вариант телефонного справочника. |
| Закрыть окно |