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

使用prolog格式谓词打印到文件,prolog,iso-prolog,Prolog,Iso Prolog,是否可以使用prolog格式谓词打印到文件 我有一个使用格式谓词打印到标准输出的数据表,即 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 separate

是否可以使用prolog
格式
谓词打印到文件

我有一个使用格式谓词打印到标准输出的数据表,即

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']).
以某种方式重用代码将相同的内容打印到文件中会很好。

您可以

考虑以下内容:

11.3.85格式/[2,3]

概要

格式(+控件,+参数)

格式(+流,+控件,+参数)

根据控制字符串解释参数,并在流上打印结果

谓词
format/[2,3]
在Prolog实现中得到广泛支持


但是,到目前为止,这些谓词还不是ISO Prolog的一部分。

我会用一个附加参数编写输出“例程”,一个
,然后在测试或打印到屏幕时通过
用户
。有关流处理,请参见ISO谓词/3、关闭/1等

请注意,IO是语言中“声明性”最少的领域之一,因为为了提高效率,需要一种基于副作用的方法


SWI Prolog有一个内置的,可以在不添加参数的情况下重用现有代码。但是既然您标记了您的问题,您真的应该添加Stream参数…

除了另一个好的答案(+1!),我想为这些任务提供一个更纯粹的解决方案

关键思想是在DCG中使
format/2
可访问,然后使用DCG描述输出

这非常简单,使用几个Prolog实现提供的
format/3
code
参数。您只需要以下简短的辅助定义:

format_(Data, Args) --> call(format_dlist(Data, Args)).

format_dlist(Data, Args, Cs0, Cs) :- format(codes(Cs0,Cs), Data, Args).
非终端的
调用//1
使用两个额外的参数调用其参数,允许您访问隐式DCG参数,这用于通过
格式/3
描述额外的代码

现在,我们只需在DCGs中使用非终结符
格式//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|...].
请注意,剩下的最后一个
format/2
用于实际将输出写入屏幕

然而,其他一切都没有副作用,并且声明性地描述了一个表


此方法的一个重要优点是,您可以轻松编写测试用例,以查看表的格式是否(仍然)正确。对Prolog代码列表(用DCG描述)进行推理很容易,但对只出现在终端上的东西进行推理却很难。

谢谢mat-我感觉这是一个优雅的解决方案,但我知道一个很难理解的方法-回到“现在学习Prolog”中的DCG部分!如需了解更多信息,请退出!