Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

Глава 11 Отладка

В данной главе рассматриваются процесс отладки программ и способ получения пользователем информации о внутренних функци­ях системы Пролог. Приведены основные характеристики отладоч­ных предикатов trace и spy. Описывается использование предиката statistics для получения статистической информации.

Написав программу на Прологе, пользователь сталкивается со следующей проблемой: как заставить ее работать. В большинстве случаев при первой попытке запуска программы Пролог - система фиксирует состояние неудачи и возвращает ответ <<нет>>.

Однако такой ответ ничего не объясняет. Необходимо средство для отслеживания работы программы.

Во многих реализациях Пролога пользователь располагает двумя методами проверки работы программы:

а) трассировка;

б) контрольные точки.

11.1. Трассировка

Трассировка позволяет пользователю наблюдать за ходом выпол­нения программы во время ее работы. При попытке Пролога доказать некоторое целевое утверждение на экране появляется сообщение, со­держащее имя цели и состояние связанных с ней параметров. Пред­положим, мы написали следующую программу:

степень (N,Р) :- integer (N),

integer (Р),!.

ст (N,Р,А),

write (N),

write ('возведенное в степень'),

write (Р),

write ('есть'),

write (A),

nl.

степень (_,_) :- write ('оба параметра не являются целыми').

степ (N,0,1) :-!

степ (N,P,R) :- M is P-l,

степ (N,M,Q),

R is Q*N.

Теперь мы выдаем запрос степень(2,4) и ожидаем получить ответ «16». Однако система отвечает «нет». Для получения информации об ошибках в программе мы рекомендуем использовать трассировку.

Опуская вопрос включения механизма трассировки, остановимся на рассмотрении информации, которая будет отображаться каждый раз при вводе целевого утверждения.

Снова напечатаем степень(2,4). На этот раз на экране появятся следующие сообщения:

CALL: степень (2,4)

CALL: integer (2)

CALL: integer (4)

CALL: ст (2,4,A)

FAIL: ст (2,4,A)

нет.

Сообщение означает, что наша программа работала нормально, но при попытке согласовать целевое утверждение ст (2,4,А) возникло состояние неудачи. При проверке оказалось, что утверждение ст (2,4,А) набрано ошибочно вместо утверждения степ (2,4,А). Ис­правим программу и повторим запуск. Сопоставление утвержде­ния степ (2,4,А) проходит успешно и программа продолжает рабо­тать. Допустим, что больше ошибок нет и мы получаем верный ответ «16».

Другой часто встречающейся ошибкой является неверное зада­ние числа параметров у предиката. Предположим, мы записали про­грамму таким образом:

степень (N,P) :- integer(N),

integer(P),

степ(N,P),

write(N),

write('возведенное в степень'),

writeP),

write('есть'),

write(A),

nl.

степень (_,_) :- write('o6a параметра не являются целыми числами'), nl.

степ (N,0,1):-!

степ (N,P,R) :- M is P-l,

степ(N,M,Q),

R is Q*N.

Тогда попытка сопоставить целевое утверждение степ(N,P) арности два с процедурой степ арности три закончится неудачей. Как и рань­ше, будет получен ответ «нет». Ошибку можно найти, воспользовав­шись механизмом трассировки, как это было сделано в предыдущем примере.

Мы рассмотрели случаи поиска простых ошибок. Тот же метод трассировки применяется и для сложных программ, содержащих воз­враты и рекурсию.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]