如何使用 JPL 获取 swi-prolog 控制台输出?
How to get swi-prolog console output using JPL?
我的一个项目需要 swipl 控制台输出(跟踪输出)。我正在尝试使用 JPL7 API 来执行此操作,但我似乎找不到从 swipl 控制台获取输出的方法。有什么办法可以做到这一点?或者是否有我可以 运行 将跟踪输出定向到文件然后从那里开始工作的查询?
提前致谢。
您可以尝试使用 protocol/1,然后开始以 leash(-all),trace
为前缀的查询
edit 一个在回溯时更改文件的解决方案(?):我将保存在一个模块中(可能命名为 trace_protocol :-) 然后将与 ?- [trace_protocol].
随后 ?- trace,trace_protocol(append(X,Y,[1,2,3])).
:- meta_predicate trace_protocol(0).
trace_protocol :-
Name = trace_protocol_index,
catch(nb_getval(Name, N), _Exc, nb_setval(Name, 0)),
% writeln(ex:Exc),
nb_current(Name, N),
% writeln(nb_current(Name, N)),
M is N+1, nb_setval(Name, M),
% writeln(nb_setval(Name, M)),
format(atom(PN), '~s_~d.tty', [Name, N]),
% writeln(trace_protocol:PN),
protocol(PN).
trace_protocol(Q) :- trace_protocol, forall(Q, trace_protocol).
编写代码花费了很多时间,因为 nb_current/2 中似乎存在错误。不应该,但它抛出一个异常 - 实际上异常是从库(clpfd)抛出的,即使它没有直接包含在我的测试模块中。
按顺序编号的 *.tty 文件最好在终端中显示,例如
$ cat *.tty
因为有 TTY 格式化转义序列。也许可以用 ?- set_prolog_flag(color_term, false).
来拒绝这样的序列
我的一个项目需要 swipl 控制台输出(跟踪输出)。我正在尝试使用 JPL7 API 来执行此操作,但我似乎找不到从 swipl 控制台获取输出的方法。有什么办法可以做到这一点?或者是否有我可以 运行 将跟踪输出定向到文件然后从那里开始工作的查询?
提前致谢。
您可以尝试使用 protocol/1,然后开始以 leash(-all),trace
edit 一个在回溯时更改文件的解决方案(?):我将保存在一个模块中(可能命名为 trace_protocol :-) 然后将与 ?- [trace_protocol].
随后 ?- trace,trace_protocol(append(X,Y,[1,2,3])).
:- meta_predicate trace_protocol(0).
trace_protocol :-
Name = trace_protocol_index,
catch(nb_getval(Name, N), _Exc, nb_setval(Name, 0)),
% writeln(ex:Exc),
nb_current(Name, N),
% writeln(nb_current(Name, N)),
M is N+1, nb_setval(Name, M),
% writeln(nb_setval(Name, M)),
format(atom(PN), '~s_~d.tty', [Name, N]),
% writeln(trace_protocol:PN),
protocol(PN).
trace_protocol(Q) :- trace_protocol, forall(Q, trace_protocol).
编写代码花费了很多时间,因为 nb_current/2 中似乎存在错误。不应该,但它抛出一个异常 - 实际上异常是从库(clpfd)抛出的,即使它没有直接包含在我的测试模块中。
按顺序编号的 *.tty 文件最好在终端中显示,例如
$ cat *.tty
因为有 TTY 格式化转义序列。也许可以用 ?- set_prolog_flag(color_term, false).