Prolog 序言:显示水平的世界

Prolog 序言:显示水平的世界,prolog,Prolog,因此,我的目标是根据这些事实(而不只是硬编码)显示世界的现状: 打印后,它应该看起来与此类似 J i L N h k m a b c D E f g ___________________________________ Table 我曾经尝试过使用类似的bagof()来抓取每一个关卡,但是如果超过两个关卡,这会变得很乏味,我

因此,我的目标是根据这些事实(而不只是硬编码)显示世界的现状:

打印后,它应该看起来与此类似

          J  
          i  L        N  
          h  k        m  
       a  b  c  D  E  f  g
       ___________________________________
           Table  
我曾经尝试过使用类似的bagof()来抓取每一个关卡,但是如果超过两个关卡,这会变得很乏味,我确信有更好的方法来抓取,我就是想不出来

bagof(X,(on(X,table)),Bottom),  
bagof(D,Z^(on(D,Z),on(Z,table)),Level01),  

非常感谢您的帮助。

将“逻辑”布局与实际IO问题分开可能会有所帮助(但请注意,没有使用左/2约束):

现在我们得到

?- coords(X),maplist(writeln,X).
[placed(j,4,2)]
[placed(i,3,2),placed(l,3,3),placed(n,3,6)]
[placed(h,2,2),placed(k,2,3),placed(m,2,6)]
[placed(a,1,1),placed(b,1,2),placed(c,1,3),placed(d,1,4),placed(e,1,5),placed(f,1,6),placed(g,1,7)]
X = [[placed(j, 4, 2)], [placed(i, 3, 2), placed(l, 3, 3), placed(n, 3, 6)], [placed(h, 2, 2), placed(k, 2, 3), placed(m, 2, 6)], [placed(a, 1, 1), placed(b, 1, 2), placed(c, 1, 3), placed(d, 1, 4), placed(..., ..., ...)|...]] 
.

[placed(a,0,1),placed(b,0,2),placed(c,0,3),placed(d,0,4),placed(e,0,5),placed(f,0,6),placed(g,0,7)]

因此,与其使用writeln/1,不如使用它来打印一行,并用空格填充跳过的列


实际上,
placed(Label,Row,Col)
中的行可以是隐式的,代码会更简单。。。查看是否可以进行此“优化”。

“因此,与其使用writeln/1,还不如用空格打印一行,以填充跳过的列。”我应该使用什么代替writeln来实现正确的间距/列对齐?感谢您的响应。只需使用低级IO原语并在递归谓词中计数,请参阅有关put/1的Prolog手册。。。我已经展示了如何使用findall/3来避免递归,如果您觉得它太难的话。。。
coords(Cs) :-
    findall(E, on(E,table), Base),
    findall(placed(E,1,C), nth1(C,Base,E), OnTable),
    rows(OnTable, [], Cs).

rows([], Rs, Rs).
rows(Row, Rows, Full) :-
    findall(placed(F,R1,C), (member(placed(E,R,C), Row), on(F,E), R1 is R+1), ThisRow),
    rows(ThisRow, [Row|Rows], Full).
?- coords(X),maplist(writeln,X).
[placed(j,4,2)]
[placed(i,3,2),placed(l,3,3),placed(n,3,6)]
[placed(h,2,2),placed(k,2,3),placed(m,2,6)]
[placed(a,1,1),placed(b,1,2),placed(c,1,3),placed(d,1,4),placed(e,1,5),placed(f,1,6),placed(g,1,7)]
X = [[placed(j, 4, 2)], [placed(i, 3, 2), placed(l, 3, 3), placed(n, 3, 6)], [placed(h, 2, 2), placed(k, 2, 3), placed(m, 2, 6)], [placed(a, 1, 1), placed(b, 1, 2), placed(c, 1, 3), placed(d, 1, 4), placed(..., ..., ...)|...]] 
.

[placed(a,0,1),placed(b,0,2),placed(c,0,3),placed(d,0,4),placed(e,0,5),placed(f,0,6),placed(g,0,7)]