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. Программа, реализующая компьютерный вариант телефонного справочника.
Закрыть окно