2012-04-21 9 views
5

¿Cómo imprimo bastante una lista de términos en SWI-Prolog?pretty-print a prolog term

que he intentado:

portray_clause([term1, term2]).

pero eso sólo escribe en un largo arroyo y una cadena incluso salen como una lista de códigos de caracteres ASCII - donde me gustaría "abc" para ser impreso.

Respuesta

1

Aquí hay una pista ... busca la diferencia entre cadenas y átomos ... probablemente solo necesites mantener las cosas como cadenas si quieres separarlas analice los caracteres individuales de la cadena, por ejemplo. usando nth0 o nth1. De lo contrario, los átomos funcionan bien para la mayoría de las cosas/pueden manipularse fácilmente.

?- write(["a", "b", "c"]). 
[[97],[98],[99]] 
true. 

?- write(['a','b','c']). 
[a,b,c] 
true. 
+0

(debería haber dicho ... la primera lista contiene cadenas, los segundos átomos) – magus

3

Este es un problema frecuente en SWI. Por "abc" por defecto es una lista de códigos de caracteres, por lo que se imprime como:

 
?- Xs = "abc". 
Xs = [97, 98, 99]. 

¿Se puede convertir de nuevo con facilidad? Imagine que tiene una lista de distancias que suceden como 97, 98 y 99. En ese caso, una cadena sería muy engañosa como respuesta. Por lo tanto, no existe una solución clara para su problema, ¡siempre que la notación de cadena signifique códigos de lista de caracteres!

Se puede cambiar el significado de "abc" a una lista de caracteres que son átomos de longitud 1:

 
?- set_prolog_flag(double_quotes,chars). 
true. 

?- Xs = "abc". 
Xs = [a, b, c]. 

Si está satisfecho con ella se puede utilizar library(double_quotes).

 
?- use_module(library(double_quotes)). 
true. 
?- Xs = "abc". 
Xs = "abc". 

Para más información, consulte this thread.

+1

Esta es una gran respuesta para imprimir las cadenas, pero no la he marcado como respuesta porque la cláusula de retratos aún no imprime términos bonitos incluso si las cadenas en ellos son mucho mejores. – codeshot