如何使用 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).

来拒绝这样的序列