美化打印Prolog术语

4

我如何在SWI-Prolog中漂亮地打印一个术语列表。

我尝试过:

portray_clause([term1, term2]).

但它只是以长流的形式写出来,而且字符串甚至被打印成ASCII字符代码列表 - 我希望"abc"被打印出来。

2个回答

2
这是SWI中经常出现的问题。默认情况下,“abc”是一个字符编码列表,因此它被打印为:
?- Xs = "abc". Xs = [97,98,99].
这个能很容易地转换回来吗? 想象一下,你有一个距离列表,这些距离恰好是97、98和99。在这种情况下,字符串作为答案会非常误导人。因此,在字符串表示法意味着字符代码列表的情况下,没有干净的解决方案!
您可以将“abc”的含义切换为长度为1的原子字符列表:
?- set_prolog_flag(double_quotes,chars). true. ?- Xs = "abc". Xs = [a,b,c].
如果您对此满意,可以使用library(double_quotes)
?- use_module(library(double_quotes)). true. ?- Xs = "abc". Xs = "abc"。
更多内容,请参见此帖子

1
这是一个很好的打印字符串的答案,但我还没有将其标记为答案,因为即使其中的字符串更好,描绘子句仍然不能漂亮地打印项。 - codeshot

0
这里有一个提示..查找字符串和原子之间的区别..如果您想要分解并分析字符串中的单个字符,那么您可能只需要将它们保存为字符串。例如使用nth0或nth1。否则,原子对于大多数事情都可以很好地工作/可以轻松操作。
?- write(["a", "b", "c"]).
[[97],[98],[99]]
true.

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

(应该是...第一个列表包含字符串,第二个列表包含原子) - magus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接