Есть ли программа, которая может нарисовать дерево поиска запросов Пролог?

Мне было интересно, существует ли инструмент, который может нарисовать пошаговое дерево поиска программы Prolog? Спасибо.

2 ответов


если ваша система Prolog имеет настраиваемый отладчик, вы можете легко напишите свой собственный код сбора графика выполнения. Предположим ваш Система Prolog имеет обратный вызов goal_tracing/2, как в Jekejeke Пролог!--6-->. После этого мы можем пойти дальше и проверить настоящую рамку и Родительский фрейм для создания ссылки на графике. Вот код:

goal_tracing(call, F) :-
    frame_property(F, sys_call_indicator(N, A)),
    frame_property(F, sys_parent_frame(G)),
    frame_property(G, sys_call_indicator(M, B)),
    !,
    update_link(N / A, M / B).
goal_tracing(_, _).

:- dynamic link/2.
update_link(A, B) :-
    link(A, B),
    !.
update_link(A, B) :-
    assertz(link(A, B)).

как видно, мы только проверяем порт вызова, и мы только смотрим на индикатор предикатов. Но возможны и другие подходы что собирать большее количество данных. Теперь нам нужна утилита для отображения результата. Есть только сброс, вызываемый перед коллекцией, и шоу, вызываемое после коллекция:

reset :-
    retract(link(_, _)), fail.
reset.

show :-
    write('http://yuml.me/diagram/scruffy/class/'),
    link(A, B),
    write(([B] -> [A])),
    write(', '),
    fail.
show.

мы производим ссылку, которая понимается yuml.я. Давайте попробуем с помощью факторной программы peano. Код программы выглядит следующим образом:

add(n, X, X).
add(s(X), Y, Z) :-
    add(X, s(Y), Z).

mul(n, _, n).
mul(s(X), Y, Z) :-
    mul(X, Y, H),
    add(Y, H, Z).

fac(n, s(n)).
fac(s(X), Y) :-
    fac(X, H),
    mul(s(X), H, Y).

мы можем запустить коллектор следующим образом:

?- reset.
?- trace.
?- fac(s(s(n)),X).
X = s(s(n))
?- nodebug.
?- show.
http://yuml.me/diagram/scruffy/class/[fac / 2] -> [fac / 2], [fac / 2] -> [mul / 3], [mul / 3] -> [mul / 3], [mul / 3] -> [add / 3], [add / 3] -> [add / 3], Yes

затем можно вставить URL-адрес в браузер и будет смотрите диаграмму. Удалить", да" в конце URL-адреса. Вот результат:

Call Graph

С Наилучшими Пожеланиями


деревья поиска пролога часто просто слишком велики, чтобы их можно было исследовать шаг за шагом, но рисование может быть довольно простым и интересным. Возможно, я попытаюсь написать его с помощью библиотеки html_write. В таком случае я доложу о результатах.

тем временем SWI-Prolog имеет довольно своеобразное представление в своем отладчик. Есть интересные подробности о дереве программы Prolog. Это не так просто использовать, и я должен признаться, что до сих пор не читал документы. Однако я часто использовал отладчик. Вы можете перемещаться по дереву и инстанцированным переменным на различных узлах. Это мощный.

визуализация пространства поиска пролога-интересная задача, которая не проста!

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