2015-11-03 67 views
2

我想打印一个9x9网格,其中显示了行和列的编号,我希望元素左对齐。 像这样:Prolog - 格式化网格表的输出

> L\C | 1 | 2 | 3 | ... | 9 | 
> --------------------------- 
> 1 | a | b | a | ... | b | 
> --------------------------- 
> 2 | a | b | a | ... | b | 
> ... 
> 9 | a | b | a | ... | b | 

表的内容具有可变大小(元素的最大尺寸是9字符的),所以如果没有使用标签\ t表可能没有正确对齐像这样:

> L\C | 1 | 2 | 3 | ... | 9 | 
> --------------------------- 
> 1 | aaaaa | bb | aa | ... | bbbbb | 
> --------------------------- 
> 2 | a | bbbbb | aaa | ... | bb | 
> ... 
> 9 | aaaaaaa | bbbb | a | ... | bb | 

我保存在lists.Like这个名单表的内容:

initialBoard([[sunTile, free, free, free, sunTile, free, free, free, sunTile], 
       [free, sunTile, free, free, free, free, free, sunTile, free], 
       [free, free, sunTile, free, free, free, sunTile, free, free], 
       [free, free, free, free, free, free, free, free, free], 
       [sunTile, free, free, free, free, free, free, free, sunTile], 
       [free, free, free, free, free, free, free, free, free], 
       [free, free, sunTile, free, free, free, sunTile, free, free], 
       [free, sunTile, free, free, free, free, free, sunTile, free], 
       [sunTile, free, free, free, sunTile, free, free, free, sunTile]]). 

对于我在prolog文档中研究的内容,我必须使用格式/ 2

任何想法如何做到这一点,简单而快速?

+1

您是否详细阅读过'format/2'格式的文档,特别是格式参数?我快速浏览了SCISTUS文档,并为每个格式字符串选项提供了大量示例。尤其要注意'〜N |','〜N +'和'〜Nt',列对齐给出了几个例子。我认为这很清楚。您是否在Prolog命令界面中尝试了'format/2'来查看它的行为? – lurker

+0

@lurker是的,我确实尝试过!但我无法弄清楚如何正确地做到这一点。 我试图用制表符打印一行元素: 'format('|〜s〜t-5 ||〜s〜t〜5 |',[free,free])' 这是一个错误,我只是不明白这个谓词 –

+0

你将需要让你的列足够宽,以保持你想要的最大值。另外,你显示的'format'('format('|〜s〜t-5 ||〜s〜t〜5 |',[free,free])。)有语法错误:'-5'应该是'〜5'。您需要准确显示您在问题中所尝试的内容(编辑您的问题以添加信息),并准确显示您看到的错误。您还需要准确显示第二个示例在正确完成时的样子(*例如*,列应该居中还是左对齐或?)。 – lurker

回答

2

只是把从SICSTUS Prolog的手册中的例子,并修改它为您的数据,这会给你心柱:

?- format("|~a~t~5||~t~a~t~8+|~t~a~t~8+|~t~a~t~8+|~n", [1,foo,bar,bah]). 
|1 | foo | bar | bah | 
true. 

这将给左对齐列:

?- format("|~a~t~5||~a~t~8+|~a~t~8+|~a~t~8+|~n", [1, foo,bar,bah]). 
|1 |foo |bar |bah | 
true. 

~5|修复了第5列的列位置。然后,将~t想象成一种弹性填充。因此~t~a~t中心,在上一列和下一列设置之间,~a对应的参数~t~a会对齐它,~a~t会左对齐。 ~8+表示在最后设定的位置之后转到第8列的位置,并建立填充器操作的下一个“边界”。

为了得到一个行分隔符:

?- format("|~`-t~29||~n"). 
|----------------------------| 
true. 

换句话说,~t将是你的弹性空间,但是,如文档中所描述的,

~`ct 

将使用的字符c作为填料。