2012-02-25 12 views

Respuesta

13

Si su sistema Prolog tiene un depurador personalizable fácilmente puede escribir su propio código de recopilación de gráficos en tiempo de ejecución. Suponga que su sistema Prolog tiene un gancho de devolución de llamada goal_tracing/2 como en Jekejeke Prolog. Luego podemos continuar e inspeccionar el marco actual y el marco principal para crear un enlace en el gráfico. Aquí está el código:

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)). 

Como puede verse que sólo inspeccionar el puerto de llamada y sólo nos fijamos en el indicador predicado. Pero también son posibles otros enfoques que recopilan más datos. Ahora necesitamos alguna utilidad para mostrar el resultado. Sólo hay un restablecimiento de ser llamado antes de la recolección, y un espectáculo que se llamó después la colección:

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

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

producimos un enlace que se entiende por yuml.me. Hagámoslo con el programa factorial Peano. El código de programa se ve de la siguiente manera:

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). 

Podemos ejecutar el recolector de la siguiente manera:

?- 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 

Entonces se puede pegar la URL en un navegador y va a ver el diagrama. Elimine el ", sí" al final de la URL. Aquí está el resultado:

Call Graph

Saludos

+0

Eres increíble. No tengo palabras. –

+0

Probablemente una de las mejores respuestas que he leído en SO. Gracias @ j4n bur53. – Will

+0

Está un poco desactualizado, los objetivos frame_property/2 necesitan una actualización. –

2

Los árboles de búsqueda de Prolog a menudo son demasiado grandes para ser examinados paso a paso, pero dibujar uno podría ser bastante simple e interesante también. Tal vez intente escribir uno usando la biblioteca html_write. En ese caso, informaré el resultado.

Mientras tanto, SWI-Prolog tiene una representación bastante peculiar en su depurador . Hay detalles interesantes sobre el árbol del programa Prolog. No es tan fácil de usar y debo confesar que todavía no he leído los documentos. Sin embargo, he usado el depurador con frecuencia. Puede navegar por el árbol y las variables instanciadas en los distintos nodos. Eso es poderoso.

¡Visualizar el espacio de búsqueda de Prolog es una tarea interesante que no es simple!

editar Olvidé mencionar que XPCE tiene la capacidad de mostrar árboles grandes. Si ya tiene tiene el árbol de prueba, mostrarlo debería ser muy fácil. Solo abre el visor. Debería haber algunos ejemplos en la ayuda del manual de XPCE. Puedes basar la pantalla en eso.

+0

@ Robert Oschler: muchas gracias por la corrección de mi post mal expresado. Es muy interesante, aunque, me temo, seguiré expresándome muy mal. Pero lo aprecio – CapelliC

+0

Fue un placer, especialmente porque la información contenida era importante. Además, ¡hola de un amigo fanático de Prolog! –

Cuestiones relacionadas