Отладка i
Если программа не действует в соответствии с ожидаемым, основная проблема состоит в том, как найти в ней ошибку (ошибки). Проще найти ошибку в отдельной части программы (или в модуле), чем во всей программе в целом. Поэтому удобным принципом отладки является проверка вначале меньших модулей программы, а затем — проверка более крупных модулей или всей программы.
Отладка программ на языке Prolog упрощается благодаря следующим двум особенностям: во-первых, Prolog является интерактивным языком, поэтому любую часть программы можно вызвать непосредственно с помощью подходящего вопроса К системе Prolog; во-вторых, в реализациях Prolog1 обычно предусмотрены специальные средства отладки. Благодаря наличию этих двух особенностей отладка программ Prolog может в целом осуществляться более эффективно по сравнению с большинством других языков программирования.
176 Часть I. Язык Prolog
Основой средств отладки является трассировка. Выражение трассировка цели означает, что во время выполнения отображается информация, относящаяся к процессу достижения цели. Эта информация включает данные, описанные ниже.
• Вступительная информация. Имя предиката и значения параметров при вызове цели.
• Заключительная информация. В случае успеха - значения параметров, которые обеспечили достижение цели; в противном случае — сообщение о неудаче.
• Информация о повторных вызовах. Вызовы той же цели, обусловленные пере
бором с возвратами.
Между вступительной и заключительной информацией может быть представлена информация трассировки для всех подцелей этой цели. Поэтому есть возможность проследить за выполнением всей процедуры поиска ответа на вопрос вплоть до целей самого низкого уровня, когда были обнаружены факты. Может оказаться, что такая подробная трассировка практически нецелесообразна из-за чрезмерного объема информации трассировки, поэтому пользователь может указать, что требуется избирательная трассировка. Для обеспечения избирательности предусмотрены два основных механизма: во-первых, подавление информации трассировки, выходящей за определенные рамки; во-вторых, трассировка не всех предикатов, а лишь некоторого заданного подмножества предикатов.
Указанные средства отладки активизируются с помощью встроенных предикатов, зависящих от системы. Типичное подмножество таких предикатов описано ниже. Предикат trace
активизирует исчерпывающую трассировку целей, которые будут выполняться в дальнейшем. Предикат notrace
прекращает дальнейшую трассировку. Предикат $ру( Р)
указывает, что необходимо выполнить трассировку предиката Р. Он используется, если указанный предикат представляет особый интерес и необходимо избежать появления информации трассировки, которая относится к другим целям (находящимся либо выше, либо ниже уровня вызова предиката Р). С помощью предиката spy можно активизировать "отслеживание" одновременно нескольких предикатов. Предикат r.ospyf Р)
прекращает "отслеживание" предиката Р.
Для подавления трассировки ниже заданного уровня могут применяться специальные команды во время выполнения программы. Кроме того, может быть предусмотрено несколько других команд отладки, таких как команды возврата к предыдущей точке выполнения. Такая операция возврата позволяет, например, повторить выполнение участка программы, применяя трассировку с большей степенью детализации.