使用prolog格式谓词打印到文件
是否可以使用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
格式
谓词打印到文件
我有一个使用格式谓词打印到标准输出的数据表,即
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部分!如需了解更多信息,请退出!