Задание 1.3
Загрузите Пролог-программу из задания 1.2.
В SWI/PROLOG есть два вида отладчиков: командный[2] и графический[3], в последнем трассировка выглядит более наглядно.
Для перехода в режим трассировки необходимо набрать встроенный предикат debug. Для выхода из режима трассировки – предикат nodebug[4].
Перейдите в режим трассировки. Для трассировки необходимо указать контрольные точки (Spy points) в меню Debug->Edit spy points->Predicate, где указать имена предикатов. В данном случае укажите предикат любит. Обратите внимание, что справа внизу находятся три кнопки, где указываются как контрольные точки, так и точки трассировки. Контрольные точки (Spy points) позволяют вызвать графический отладчик. Точки трассировки (Trace points)— консольный отладчик. Третий выбор — просмотр и редактирование файла программы, содержащей, введенный в поле Predicate, предикат. Внешний вид изображен на снимке ниже.
ЗАМЕЧАНИЕ. На момент написания методички графический отладчик не поддерживал русских предикатов (не работает корректно указание контрольных точек и точек трассировки через графический интерфейс). В связи с этим опишем предикаты относящиеся к отладке программы с использованием командной строки.
Предикат | Описание |
trace | Включить режим трассировки. Если не указаны точки трассировки, будет производиться полная пошаговая трассировка. |
tracing | Успешен, если вызывается из режима трассировки. |
notrace | Выход из режима трассировки. |
guitracer, gtrace | Включить графического режима трассировки. Окно графического режима трассировки включается при встрече первой контрольной точки (spy-point). |
noguitracer | Отключить графического режима трассировки. |
trace(Pred) | Установить точку трассировки предиката с именем Pred (то есть отображаться при трассировке будет каждое событие связанное с предикатом Pred). |
trace(Pred,Ports) | Установить точку трассировки предиката с именем Pred и активирующейся по событиям (при прохождении по портам) Ports. События могут быть следующих типов: 1. fail – событие соответствующее неудачному вызову предиката с именем Pred; 2. call – событие соответствующее первому вызову предиката с именем Pred; 3. redo – событие соответствующее повторному вызову предиката с именем Pred; 4. exit – событие соответствующее успешному окончанию вызова предиката с именем Pred. Сам же параметр Ports может принимать значения типов сообщений с префиксами соответствующими добавлению и удалению события (порта) из точки трассировки а так же списки таких значений. Например, запрос ?- trace(foo/2, +fail), trace(foo/2, [+call,-fail]). добавляет в точку трассировки связанную с предикатом foo/2 событие fail. Для добавления события используют префикс +, для изъятия -. Кроме того можно оперировать сразу со всеми типами событий, используя обозначение all. Пример: trace(foo/2, +all). |
debug | Включить режим отладки. При запросах к программе в режиме отладки выводятся все события, происходящие при выполнении запроса, связанные с установленными точками отладки. |
nodebug | Отключить режим отладки. |
debugging | Показать отслеживающиеся точки трассировки и контрольные точки |
spy(Pred) | Установить контрольную точку, связанную с предикатом Pred. |
nospy(Pred) | Убрать контрольную точку, связанную с предикатом Pred. |
nospyall | Убрать все контрольные точки. |
Тогда именно на указанных предикатах трассировка будет останавливаться и показывать промежуточный результат. Остальные не указанные предикаты не будут показаны (если не указаны никакие контрольные точки, то режим трассировки будет неотличим от обычного режима работы интерпретатора).
Задайте запрос
?-любит(X,теннис),любит(X,компьютеры).
и посмотрите, что произойдет. После получения первого решения получите все остальные, вводя ;. Трассировка изображена на следующем рисунке:
В левой верхней части окна графического отладчика отображены текущие значения переменных текущего выполняемого предиката, справа стек вызовов предикатов, в нижней части факты и правила, где цветом отмечен следующий вызываемый предикат. Внешний вид графического отладчика изображен на рисунке. Сверху, в виде кнопок, находятся допустимые действия. Вторая кнопка (стрелка вправо) позволяет выполнять программу пошагово (предикат за предикатом). Цвет выделения также имеет значение. Красный цвет обозначает неудачу, ложность решения.