seeing(F)
F отождествляется с именем файла, связанного со стандартным входным потоком.
telling(F)
F отождествляется с именем файла, связанного со стандартным выходным потоком.
Если при выполнении описанных выше предикатов оказывается, что файл F не существует или переменная F не конкретизирована, возникает ошибка.
Кроме стандартных входного и выходного потоков, в большинстве реализаций Пролога используются и другие потоки, служащие для связи с файлами.
open(F,S,A)
Предикат открывает файл F в поток S. Если значением А является read, файл открывается для чтения, а если А принимает значение write, то файл открывается для записи.
close(S)
Предикат закрывает поток S.
При выполнении рассматриваемых целевых утверждений должны быть конкретизированы переменные: S - имя потока, F - имя файла, А - режим доступа.
Если поток S открыт, мы должны использовать все имеющиеся предикаты ввода и вывода, указывая имя потока в качестве первого аргумента. Например, в результате выполнения последовательности утверждений
?- open(тестфайл, элемент, write),
write (элемент, тестпоток),
n1 (элемент) ,close (элемент).
в файл тестфайл будут выведены запись 'тестпоток' и признак новой строки.
Редактирование программ на Прологе
В большинстве Пролог-систем есть встроенный редактор, позволяющий пользователю вносить изменения в программу во время сеанса работы с Прологом. Если такой возможности нет, необходимо выйти из среды Пролога, отредактировать программу и снова вернуться в Пролог-систему. Обычно для редактирования файла в Прологе используется предикат
edit(F),
где F - имя файла.
После того как файл отредактирован, он автоматически повторно вводится в базу данных Пролога для поддержания ее в актуальном состоянии.
Распечатка предикатов
Для того чтобы проверить, какие утверждения входят в программу, можно воспользоваться следующими предикатами :
listing
Предикат выводит все утверждения, содержащиеся в базе данных Пролога, в стандартный выходной поток.
listing(C)
Если С - атом, то в стандартном выходном потоке печатаются все процедуры с функтором С. Если С - терм, имеющий функтор F арности А, то печатаются только процедуры с функтором F и арностью А.
В результате выполнения предиката
listing(фред/2)
будет напечатан список всех утверждений, головой которых является функтор 'фред', а арность равна двум.
7 Отладка
В данной главе рассматриваются процесс отладки программ и. способ получения пользователем информации о внутренних функциях системы Пролог. Приведены основные характеристики отладочных предикатов trace и spy. Описывается использование предиката statistics для получения статистической информации.
Написав программу на Прологе, пользователь сталкивается со следующей проблемой: как заставить ее работать. В большинстве случаев при первой попытке запуска программы Пролог - система фиксирует состояние неудачи и возвращает ответ «нет».
Однако такой ответ ничего не объясняет. Необходимо средство для отслеживания работы программы.
Во многих реализациях Пролога пользователь располагает двумя методами проверки работы программы:
а) трассировка;
б) контрольные точки.
Трассировка позволяет пользователю наблюдать за ходом выполнения программы во время ее работы. При попытке Пролога доказать некоторое целевое утверждение на экране появляется сообщение, содержащее имя цели и состояние связанных с ней параметров. Предположим, мы написали следующую программу:
степень (N, P):-integer (N),
integer (P),!,
ст(N, P,A),
write (N),
write ('возведенное в степень'),
write (P),
write (‘есть'),
write (A),
nl.
степень (_,_):-write ('оба параметра не являются целыми').
степ (N,0,1):-!
степ (N, P,R):-M is P-1,
степ(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):-inleger(N),
integer(P),
степ(М, Р),
write(N),
write(‘возведенное в степень'),
write (P),
write('ecть'),
write (A),
nl.
степень (_,_):-write (‘ оба параметра не являются целыми числами'), nl.
степ (N,0,1):-!
cтeп(N, P,R):- M is P-1,
степ(N, M,Q),
R is Q*N.
Тогда попытка сопоставить целевое утверждение степ(N,P) арности два с процедурой степ арности три закончится неудачей. Как и раньше, будет получен ответ «нет». Ошибку можно найти, воспользовавшись механизмом трассировки, как это было сделано в предыдущем примере.
Мы рассмотрели случаи поиска простых ошибок. Тот же метод трассировки применяется и для сложных программ, содержащих возвраты и рекурсию.
Включение и выключение механизма трассировки
При загрузке системы Пролог трассировка обычно выключена. Механизм включения трассировки зависит от реализации системы Пролог. Ниже описаны два типичных метода включения механизма трассировки.
1. Использование механизма прерывания с клавиатуры, например одновременное нажатие клавиш CTRL и Т. Повторное нажатие клавиш CTRL и Т приводит к отключению трассировки. Программист может использовать данный метод при разработке программы за терминалом.
2. Использование предиката trace для включения режима трассировки и предиката notrace для выключения. К данному методу программист обращается при проверке отдельных частей программы. Предикат trace нужно вставить в программу непосредственно перед проверяемым участком, а предикат notrace - сразу после него. В результате пользователю выдается информация о трассировке для последовательности целевых утверждений, находящихся между этими двумя предикатами.
Если происходит повторный запуск системы Пролог после возникновения ошибки или срабатывания средства прерывания в контрольной точке, режим трассировки обычно выключается.
Предикаты, содержащие точки трассировки, запоминаются системой и вызываются вновь при включении соответствующего режима трассировки.
Необязательные параметры трассировки
Помимо уже описанных общих параметров трассировки, некоторые реализации Пролога поддерживают дополнительные параметры. Благодаря им пользователь имеет возможность подключать точки трассировки к любому предикату в своей программе. После присоединения точек трассировки пользователь может включать режим трассировки. В результате информация о трассировке будет выводиться на терминал (или устройство печати) только в том случае, когда при выполнении программы на Прологе предикаты с точками трассировки становятся целевыми утверждениями. Количество информации, появляющейся на дисплее, существенно сокращается: отображаются только предикаты, представляющие интерес для пользователя.
Предикаты трассировки
Встроенными обычно бывают следующие предикаты трассировки:
trace (F) Подключает точки трассировки ко всем процедурам с главным функтором F.
trace (F/A) Подключает точки трассировки ко всем процедурам с главным функтором F и арностью А.
trace ([F/A,F1/A1,...]) Подключает точки трассировки к списку процедур с функторами F, F1 и арностью А, А1 соответственно.
notrace Удаляет точки трассировки из всех процедур с главным функтором F.
notrace (F/A) Удаляет точки трассировки из всех процедур с
главным функтором F и арностью А.
notrace ([F/A,F1/A1),...J) Удаляет точки трассировки из всех процедур
с функторами F, F1 и арностью А, А1 соответственно.
notraceall Этот предикат удаляет все точки трассировки,
существующие в базе данных Пролога.
Режимы трассировки
Некоторые реализации Пролога позволяют пользователю выбирать тот режим трассировки, при котором в процессе выполнения целевого утверждения Пролога информация выдается в одной или нескольких точках CALL, FAIL, REDO и EXIT*.
Наличие таких средств также позволяет пользователю более гибко управлять количеством информации, выдаваемой на терминал.
В процессе отладки иногда возникает необходимость приостановить работу программы при доказательстве каждой цели. В Прологе для этого имеется средство, называемое методом контрольных точек.
Применение контрольных точек дает возможность пользователю остановить выполнение программы при переходе к новой цели, проверить состояние параметров и, возможно, воздействовать на дальнейший процесс доказательства.
Метод контрольных точек аналогичен пошаговому режиму выполнения команд, применяемому при разработке программ на языке Ассемблера.
Возможные действия в контрольной точке
Возможности, имеющиеся в контрольной точке, зависят от реализации Пролога, но в общем их можно свести к следующим:
а (abort/прекратить) - вернуться на верхний уровень интерпретатора;
b (backtrace/вернуться назад) - показать последние N выполненных целевых утверждений;
f (fail/неудача) - установить результат «неудача» при доказательстве текущей цели;
s (succeed/успех) - установить результат «успех» при доказательстве текущей цели.
Включение и выключение режима контрольных точек
При первой загрузке системы Пролог режим установки контрольных точек обычно бывает отключен. Впоследствии он может быть включен одним из способов, зависящих от реализации Пролога.
Приведем два типичных метода включения режима контрольных точек.
1. Использование механизма прерывания с клавиатуры, например одновременное нажатие клавиш CTRL и S. Повторное нажатие клавиш CTRL и S приводит к отключению режима контрольных точек. Программист имеет возможность применить данный метод при разработке программы за терминалом.
2. Применение предиката spy для включения режима контрольных точек и предиката nospy для выключения. Данный метод служит для проверки отдельных частей программы. Предикат spy необходимо вставить в программу непосредственно перед проверяемым участком, а предикат nospy - сразу после него.
В результате выполнение программы будет приостанавливаться на каждом целевом утверждении из последовательности, находящейся между этими двумя предикатами.
Если происходит повторный запуск Пролог-системы после возникновения ошибки или выполнения операции прерывания в контрольной точке, режим контрольных точек обычно отключается.
Предикаты, содержащие контрольные точки, могут запоминаться системой и вызываться при включении соответствующего режима.
Необязательные параметры режима контрольных точек
Кроме общих параметров режима контрольных точек, рассмотренных ранее, некоторые реализации Пролога поддерживают специальные параметры. Если это необходимо, пользователю разрешается подключать контрольные точки к любому предикату в своей программе. После присоединения контрольных точек пользователь включает режим контрольных точек, который прерывает выполнение программы только в тот момент, когда целевыми утверждениями контрольными точками. Благодаря этому программы на Прологе выполняются обычным образом (за исключением скорости выполнения) между целевыми утверждениями с контрольными точками.
Предикаты для работы с контрольными точками
spy(F) Устанавливает контрольные точки для всех процедур с главным функтором F.
spy(F/A) Устанавливает контрольные точки для всех процедур с главным функтором F и арностью А.
spy([F/A,Fl/Al,...]) Устанавливает контрольные точки для списка процедур с функторами F, F1 и арностью А, А1 соответственно.
nospy(F) Удаляет контрольные точки из всех процедур с главным функтором F.
nospy(F/A) Удаляет контрольные точки из всех процедур с главным функтором F и арностью А.
nospy([F/A, Fl/Al,...]) Удаляет контрольные точки из списка процедур с функторами F, F1 и арностью А, А1 соответственно.
nospyall Удаляет все контрольные точки, существующие в базе данных Пролога.
Режимы, связанные с контрольными точками
В некоторых реализациях Пролога пользователю разрешается выбрать тот режим контрольных точек, при котором происходит останов в любой из точек CALL, FAIL, REDO и EXIT при выполнении Пролог-программы. Это дает возможность пользователю управлять количеством информации, выдаваемой на терминал.
Основные отладочные предикаты
nodebug Отключает режим трассировки и режим
контрольных точек.
Статистическая информация
Иногда пользователю требуется следующая информация:
—сколько времени Пролог-программа выполнялась в системе;
—сколько логических выводов совершила система во время выполнения программы. (Замечание. Логический вывод - выполнение одного целевого утверждения Пролога.);
—сколько места занимает база данных Пролога?
Такую информацию обычно можно получить с помощью встроенных предикатов. Имена предикатов и их параметры зависят от реализации, но, как правило, они аналогичны именам и параметрам предикатов, описанных ниже.
Встроенный предикат statistics(T,L) конкретизирует переменную Т значением текущего процессорного времени (обычно в миллисекундах) , а аргумент L - числом произведенных логических выводов. Попытка доказать целевое утверждение statistics (T,L) всегда заканчивается успехом.
Например, требуется определить, сколько времени понадобится программе степень, чтобы возвести 50 в степень 4 и выдать ответ. Зададим новый предикат время:
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 |


