使用prolog格式谓词打印到文件

时间:2015-07-30 15:47:37

标签: prolog

是否可以使用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']).

以某种方式重用代码将相同的东西打印到文件中会很好。

3 个答案:

答案 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,可以在不添加参数的情况下重用现有代码。但是,既然您标记了您的问题,那么您应该添加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描述),但很难推理只出现在终端上的东西。