这是我使用的代码:
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网格,单元格大小相同。 相反,我得到了这个:
我希望所有列都显示为图像中的第一列,我的意思是我希望所有其他单元格具有相同的宽度。
为什么我的代码不能用于第二列等等?
答案 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-else
与printElement/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.