Если в вашей системе 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.Вот результат:
С наилучшими пожеланиями