Задание 1.3

Загрузите Пролог-программу из задания 1.2.

В SWI/PROLOG есть два вида отладчиков: командный[2] и графический[3], в последнем трассировка выглядит более наглядно.

Для перехода в режим трассировки необходимо набрать встроенный предикат debug. Для выхода из режима трассировки – предикат nodebug[4].

 
  задание 1.3 - student2.ru

Перейдите в режим трассировки. Для трассировки необходимо указать контрольные точки (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,компьютеры).

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

задание 1.3 - student2.ru

В левой верхней части окна графического отладчика отображены текущие значения переменных текущего выполняемого предиката, справа стек вызовов предикатов, в нижней части факты и правила, где цветом отмечен следующий вызываемый предикат. Внешний вид графического отладчика изображен на рисунке. Сверху, в виде кнопок, находятся допустимые действия. Вторая кнопка (стрелка вправо) позволяет выполнять программу пошагово (предикат за предикатом). Цвет выделения также имеет значение. Красный цвет обозначает неудачу, ложность решения.

задание 1.3 - student2.ru

Наши рекомендации