Отладка I

Если программа не действует в соответствии с ожидаемым, основная проблема со­стоит в том, как найти в ней ошибку (ошибки). Проще найти ошибку в отдельной части программы (или в модуле), чем во всей программе в целом. Поэтому удобным принципом отладки является проверка вначале меньших модулей программы, а за­тем — проверка более крупных модулей или всей программы.

Отладка программ на языке Prolog упрощается благодаря следующим двум осо­бенностям: во-первых, Prolog является интерактивным языком, поэтому любую часть программы можно вызвать непосредственно с помощью подходящего вопроса К системе Prolog; во-вторых, в реализациях Prolog1 обычно предусмотрены специальные средства отладки. Благодаря наличию этих двух особенностей отладка программ Prolog может в целом осуществляться более эффективно по сравнению с большинст­вом других языков программирования.

176 Часть I. Язык Prolog


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

• Вступительная информация. Имя предиката и значения параметров при вызо­ве цели.

• Заключительная информация. В случае успеха - значения параметров, кото­рые обеспечили достижение цели; в противном случае — сообщение о неудаче.

• Информация о повторных вызовах. Вызовы той же цели, обусловленные пере­
бором с возвратами.

Между вступительной и заключительной информацией может быть представлена информация трассировки для всех подцелей этой цели. Поэтому есть возможность проследить за выполнением всей процедуры поиска ответа на вопрос вплоть до целей самого низкого уровня, когда были обнаружены факты. Может оказаться, что такая подробная трассировка практически нецелесообразна из-за чрезмерного объема ин­формации трассировки, поэтому пользователь может указать, что требуется избира­тельная трассировка. Для обеспечения избирательности предусмотрены два основных механизма: во-первых, подавление информации трассировки, выходящей за опреде­ленные рамки; во-вторых, трассировка не всех предикатов, а лишь некоторого за­данного подмножества предикатов.

Указанные средства отладки активизируются с помощью встроенных предикатов, зависящих от системы. Типичное подмножество таких предикатов описано ниже. Предикат trace

активизирует исчерпывающую трассировку целей, которые будут выполняться в дальнейшем. Предикат notrace

прекращает дальнейшую трассировку. Предикат $ру( Р)

указывает, что необходимо выполнить трассировку предиката Р. Он используется, если указанный предикат представляет особый интерес и необходимо избежать появ­ления информации трассировки, которая относится к другим целям (находящимся либо выше, либо ниже уровня вызова предиката Р). С помощью предиката spy мож­но активизировать "отслеживание" одновременно нескольких предикатов. Предикат r.ospyf Р)

прекращает "отслеживание" предиката Р.

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