Есть ли программа, которая может нарисовать дерево поиска запросов Prolog? - PullRequest
8 голосов
/ 26 февраля 2012

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

Ответы [ 3 ]

13 голосов
/ 26 февраля 2012

Если в вашей системе Prolog есть настраиваемый отладчик, вы можете легко написать свой собственный код сбора графиков времени выполнения.Предположим, что ваша система Prolog имеет функцию перехвата обратного вызова goal_tracing / 2, как в Jekejeke Prolog .Затем мы можем перейти к проверке текущего кадра и родительского кадра, чтобы создать ссылку на графике.Вот код:

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.me .Давайте попробуем с факторной программой 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

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

2 голосов
/ 26 февраля 2012

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

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

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

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

0 голосов
/ 31 декабря 2018

Взгляните на sldnfdraw для swi-prolog, он работает как шарм, единственная проблема, с которой я столкнулся, заключается в том, что термины не могут содержать подчеркивания, но я уже отправил электронное письмо его авторусообщая об этом.

Он создает текстовый файл с представлением в виде дерева, а затем с помощью некоторых команд bash преобразует его в png для визуализации.

latex file.tex
dvipdf file.dvi
pdfcrop file.pdf
pdftoppm file-crop.pdf|pnmtopng > file.png

Я также рекомендую добавить \usepackage[landscape]{geometry}, чтобы получить дополнительное пространствок дереву.

...