是否可以使用prolog format
谓词打印到文件?
我有一个数据表,我使用格式谓词打印到stdout,即
print_table :-
print_table_header,
forall(range(1.0,10.0,0.1,N), print_row(N,L)).
%% print_row(L) :- take a list of the form, [a,b,c,d,e] and
%% print it to screen as a single row of tab separated float values (1DP)
print_row(N,L) :-
build_row(N,L),
format('~t~1f~10+ ~t~1f~10+ ~t~1f~10+ ~t~1f~10+ ~t~1f~10+ ~n', L).
print_table_header :-
format('~t~w~10+ ~t~w~10+ ~t~w~10+ ~t~w~10+ ~t~w~10+ ~n', ['N','N2','N3','N4','N5']).
以某种方式重用代码将相同的东西打印到文件中会很好。
答案 0 :(得分:3)
你可以!
考虑SICStus Prolog documentation for format/[2,3]
的以下摘录:
11.3.85格式/ [2,3]
概要
格式(+ Control,+ Arguments)
格式(+ Stream,+ Control,+ Arguments)
根据Control字符串解释Arguments并在Stream上打印结果。
Prolog实现广泛支持谓词format/[2,3]
。
但是,截至目前,这些谓词并非ISO Prolog的一部分。
答案 1 :(得分:3)
我会使用附加参数Stream
编写输出'例程',然后在测试或打印到屏幕时我会传递user
。请参阅ISO谓词open / 3,关闭/ 1等以进行流处理...
请注意,IO是该语言中最少的“声明性”区域之一,因为为了提高效率,需要一种基于副作用的方法......
SWI-Prolog有一个内置with_output_to,可以在不添加参数的情况下重用现有代码。但是,既然您标记了iso-prolog您的问题,那么您应该添加Stream参数...
答案 2 :(得分:3)
除了其他好的答案(+1!)之外,我想为这些任务提供更纯粹的解决方案。
关键的想法是在DCG中使format/2
可访问,然后使用DCG来描述输出。
这很简单,使用codes
的{{1}}参数,由几个Prolog实现提供。您只需要以下简短的辅助定义:
format/3
非终结符format_(Data, Args) --> call(format_dlist(Data, Args)).
format_dlist(Data, Args, Cs0, Cs) :- format(codes(Cs0,Cs), Data, Args).
使用另外两个参数调用其参数,这些参数允许您访问隐式DCG参数,这用于通过call//1
描述其他代码。
现在,我们可以简单地在DCG中使用非终结format/3
。
例如,描述一个简单的表:
format_//2
用法示例和结果:
table -->
row([a,b,c]),
row([d,e,f]).
row(Ls) --> format_("~t~w~10+~t~w~10+~t~w~10+~n", Ls).
请注意,剩下的最后一个?- phrase(table, Cs), format("~s", [Cs]).
a b c
d e f
Cs = [32, 32, 32, 32, 32, 32, 32, 32, 32|...].
用于将输出实际写入屏幕。
然而,其他一切都没有副作用,并以声明方式描述了一个表格。
此方法的一个重要优点是您可以轻松编写测试用例,以查看您的表格是否(仍然)格式正确。很容易推理出Prolog的代码列表(用DCG描述),但很难推理只出现在终端上的东西。