2012-04-21 8 views
5

SWI-Prologで用語のリストを印刷するにはどうすればよいですか?プロローグ用語をきれいに印刷

portray_clause([term1, term2]).

が、それはただ長いストリームに書き出すと、文字列もASCII文字コードのリストとして出てくる - 私はあることを「ABC」を希望:

私が試してみました印刷されます。

答えて

1

これはヒントです。文字列と原子の違いを調べます。たとえば、文字列の個々の文字を解析する場合は、文字列として保持する必要があります。 nth0またはnth1を使用します。さもなければ、原子はほとんどの事に対してうまく働く/簡単に操作できる。

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

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

(最初のリストには文字列、2番目のアトムが含まれているはずです) – magus

3

これはSWIで頻繁に発生する問題です。デフォルトの「ABC」とは、文字コードのリストであるので、それは次のように印刷されています。これは、バックやすい

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

を変換することができますか。 となる距離のリストが97,98、および99であるとします。この場合、文字列は非常に誤解を招く可能性があります。したがって、文字列表記が文字コードのリストを意味する限り、あなたの問題にはきれいな解決策はありません!

あなたは長さ1の原子である文字のリストに「ABC」の意味を切り替えることができます:あなたはそれに満足している場合は、library(double_quotes)を使用することができます

 
?- set_prolog_flag(double_quotes,chars). 
true. 

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

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

詳細については、this threadを参照してください。

+1

これは文字列を印刷するのに最適な答えですが、ポートレイ句はまだ用語を印刷していないため、答えとしてマークしていませんそれらの文字列がはるかに優れている場合でも。 – codeshot

関連する問題