Prolog - 打印格式为/ 2的列表列表

时间:2015-11-03 18:25:26

标签: printing grid prolog format

这是我使用的代码:

printElement(L/C) :- format('~t~a - ~a~t~20+|', [L, C]).
printElement(L) :- format('~t~a~t~20+|~t', L).

printList([]) :- format('~n', []).

printList([H|T]) :-
    printElement(H),
    printList(T).

printLists([], _).
printLists([H|T], N) :-
    M is N + 1,
    format('~d- |', M),
    printList(H),
    printLists(T, M).

BL 列表列表我将谓词称为printLists(BL, 0).

我的目标是将 BL 显示为9x9网格,单元格大小相同。 相反,我得到了这个:

output1

我希望所有列都显示为图像中的第一列,我的意思是我希望所有其他单元格具有相同的宽度。

为什么我的代码不能用于第二列等等?

3 个答案:

答案 0 :(得分:2)

这是一种不同的方法,它使用构建格式字符串(实际上是原子)的谓词和基于输入行的更新数据列表。这通过为整行构建单个格式字符串来绕过每行多个格式的问题,从而可以为每一行调用单个% makeFormat/4 % makeFormat(-RowData, -FormatPrefix, +NewRowData, +Format) % makeFormat([], F0, [], F) :- atom_concat(F0, '~n', F). makeFormat([E|Es], F0, L, F) :- ( E = A/B -> atom_concat(F0, '~t~a - ~a~t~20+|', F1), L = [A,B|Ls] ; atom_concat(F0, '~t~a~t~20+|', F1), L = [E|Ls] ), makeFormat(Es, F1, Ls, F). printLists([], _). printLists([H|T], N) :- M is N + 1, makeFormat(H,'~d- |', H1, Format), % make format starting with '~d- |' format(Format, [M|H1]), % write out the list with prefix printLists(T, M).

xLabel

答案 1 :(得分:1)

此机制的问题在于,在此上下文中,由于某些原因,format/2列定位似乎无法在多次调用format/2之间按预期工作。但是,如果你使用~@格式说明符,它实际上会工作[好吧,可能工作,因为我只能在具有相同{{1}的SWI Prolog上尝试它选项]。

format/2格式选项告诉~@将下一个参数作为Prolog谓词调用。

这是一个例子。而不是:

format

试试这个:

printElement(L/C) :- format('~t~a - ~a~t~20+|', [L, C]).
printElement(L) :- format('~t~a~t~20+|~t', L).

请注意,我添加了printElement(L) :- ( L = A/B -> format('~@', print2(A, B)) ; format('~@', print1(L)) ). print2(L, C) :- format('~t~a - ~a~t~20+|', [L, C]). print1(L) :- format('~t~a~t~20+|', L). % Not sure why you have the extra '~t' % in your format; I removed it 构造,以避免第二个if-elseprintElement/1形式匹配。

答案 2 :(得分:1)

这是另一种适用于SWI Prolog的方法。您需要在SICSTUS Prolog中尝试它以查看它是否也在那里工作。只需对原始解决方案进行以下谓词更新:

printElement(L/C) :- format('~0+~t~a - ~a~t~20+|', [L, C]).  % added '~0+'
printElement(L) :- format('~0+~t~a~t~20+|', L).              % added '~0+'

printList([]) :- format('~n').   % [] argument unnecessary in format, so removed

printElement中,我在每个格式字符串(atom)的开头添加了~0+,以便在格式化的其余部分发生之前建立相对列位置。如果这在SICSTUS下无效,您可以尝试~1+。但是在SWI中,我使用~0+得到了预期的输出。我喜欢这种解决方案比将任意长格式字符串粘贴在一起更好。

原始代码测试:

?- printList([a,b,c]).
         a          |b|c|
true.

更新了代码测试:

?- printList([a,b,c]).
         a          |         b          |         c          |
true.