2012-04-21 18 views
5

Jak ładnie wydrukować listę terminów w SWI-Prolog.pretty-print prolog termin

Próbowałem:

portray_clause([term1, term2]).

ale tylko pisze się w długi ciąg strumienia i nawet wychodzi jako lista kodów ASCII znaków - gdzie chciałbym „ABC” będzie wydrukowane.

Odpowiedz

1

Oto podpowiedź ... sprawdź różnicę między łańcuchami i atomami. Prawdopodobnie potrzebujesz tylko trzymać rzeczy jako ciągi, jeśli chcesz je rozdzielić i przeanalizować poszczególne znaki ciągu, np. używając nth0 lub nth1. W przeciwnym razie atomy działają dobrze dla większości rzeczy/mogą być łatwo manipulowane.

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

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

(należy powiedzieć, że pierwsza lista zawiera ciągi, drugie atomy) – magus

3

Jest to częsty problem w SWI. Domyślnie "abc" to lista kodów znaków, dlatego jest drukowana jako:

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

Czy można to z łatwością zmienić? Wyobraź sobie, że masz listę odległości, które zdarzą się na 97, 98 i 99. W takim przypadku ciąg byłby bardzo mylący jako odpowiedź. Dlatego nie ma żadnego czystego rozwiązania twojego problemu, o ile notacja łańcuchowa oznacza kody listy znaków!

Można przełączać znaczenie „abc” do listy znaków, które są atomy długości 1:

 
?- set_prolog_flag(double_quotes,chars). 
true. 

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

Jeśli jesteś zadowolony z niego można użyć library(double_quotes).

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

Aby uzyskać więcej informacji, zobacz this thread.

+1

To jest świetna odpowiedź do drukowania ciągów znaków, ale nie oznaczono jej jako odpowiedzi, ponieważ klauzula portray nadal nie nadaje się do drukowania nawet jeśli struny w nich są znacznie lepsze. – codeshot