Me preguntaba si existe una herramienta que pueda dibujar un árbol de búsqueda paso a paso de un programa Prolog. Gracias.¿Hay algún programa que pueda dibujar un árbol de búsqueda de consultas Prolog?
Respuesta
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:
Saludos
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.
@ 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
Fue un placer, especialmente porque la información contenida era importante. Además, ¡hola de un amigo fanático de Prolog! –
- 1. ¿Hay algún programa que pueda ayudar a entender otro programa?
- 2. ¿Hay algún programa que pueda simular una conexión de red inestable?
- 3. ¿Hay algún tipo de firma que Haskell no pueda verificar?
- 4. ¿Hay algún proyecto serio con PROLOG?
- 5. ¿Hay algún programa para dibujar y probar máquinas de estado, máquinas de turing, etc.?
- 6. ¿Hay algún árbol B o sitios que muestren visualmente cómo funciona un árbol B?
- 7. ¿Hay algún programa que ofusque el código fuente de C#?
- 8. ¿Hay algún módulo Perl que pueda automatizar ollydbg?
- 9. Prolog Árbol genealógico
- 10. ¿Hay algún programa para descompilar Delphi?
- 11. ¿Hay algún árbol de raíz/patricia/critbit para Python?
- 12. ¿Hay algún programa como LINQPad para Java?
- 13. ¿Hay un árbol de búsqueda binaria incorporado en .NET 4.0?
- 14. ¿Hay algún método que pueda anular en un objeto JavaScript para controlar lo que muestra console.log?
- 15. Centro de búsqueda del árbol
- 16. Programa para dibujar diagramas de bloques VHDL?
- 17. ¿Hay algún Descompilador de Java que pueda descompilar correctamente las llamadas a métodos sobrecargados?
- 18. ¿Hay algún complemento de Rails que pueda generar modelos, vistas, etc. utilizando los escenarios de Cucumber?
- 19. Cómo dibujar (editar) un árbol git ascii
- 20. ¿Hay algún Validator SQL que pueda verificar la sintaxis contra múltiples servidores de bases de datos?
- 21. ¿Hay algún gestor de repositorio de git decente que se pueda descargar?
- 22. ¿Hay algún parámetro que pueda usar en Java que funcione con todos los bucles for-each?
- 23. búsqueda binaria vs árbol de búsqueda binaria
- 24. Equilibrar un árbol de búsqueda ternario
- 25. Implementando un árbol de búsqueda binaria equilibrado?
- 26. ¿Hay algún módulo Perl que me impida agregar `o morir` a cualquier cosa que pueda fallar?
- 27. ¿Hay algún atributo similar a OutputCache que pueda usar en los métodos normales de C#?
- 28. ¿Hay algún método que indique a mi programa que se cierre?
- 29. ¿Hay algún repositorio en el que pueda descargar dispositivos virtuales de Android?
- 30. ¿Hay algún archivo de prueba HTML que pueda usar para restablecer CSS?
Eres increíble. No tengo palabras. –
Probablemente una de las mejores respuestas que he leído en SO. Gracias @ j4n bur53. – Will
Está un poco desactualizado, los objetivos frame_property/2 necesitan una actualización. –