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