将 SWI-Prolog 控制台输出重定向到一个文件

Redirect SWI-Prolog console output to a file

我正在尝试将 make_tests 的输出写入文件,但我尝试的任何操作似乎都无法在输出文件中插入正确的信息。

我查看了 http://www.complang.tuwien.ac.at/SWI-Prolog/Manual/IO.html 上的 SWI 文档并尝试了一大堆这些谓词,但 none 有效。

这是我正在尝试做的事情:

:- use_module(library(test_wizard)).

init_test_file(FILE) :-
   set_prolog_flag(log_query_file, FILE).

gen_test_in(FILE) :-
   make_tests(lists, FILE, current_output).

所以 运行 这个(在控制台中)例如:

init_test_file('mytest.pro').
member(a, [a,b]).
gen_test_in('mytest.pro').

我得到以下输出(在控制台中):

true.

6 ?- gen_test_in('r.pro').
:- begin_tests(lists).

test(member, [nondet]) :-
        member(a, [a, b]).

:- end_tests(lists).
true.

如何在文本文件中获得相同的输出(从 begin_tests 开始到 end_tests 结束?

我试过将 gen_test_in 修改为:

gen_test_in(FILE) :-
   open(FILE, write, Out),
   make_tests(lists, FILE, Out),
   close(Out).

但我只得到一个空文本文件。

你在搞乱这里的论点。您正在使用的库 library(test_wizard) 用于从查询生成测试。在您使用的谓词 make_tests/3 中,您有以下三个参数:

  1. 模块
  2. 来自的文件读取
  3. 生成的测试是写入

在您使用的示例中,您要么将输出流设置为 current_output(如果您在顶层,则为标准输出),或者在您给出的最后一个示例中,您正在打开您要读取的文件 写入 ,然后将文件及其句柄传递给 make_tests/3。相反,如果您有一个名为 queries.pl:

的文件
$ cat queries.pl
member(a, [a,b]).
member(X, [a,b]).

然后:

$ swipl
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.16-36-g42820df)
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistribute it under certain conditions.
Please visit http://www.swi-prolog.org for details.

For help, use ?- help(Topic). or ?- apropos(Word).

?- use_module(library(test_wizard)).
true.

?- setup_call_cleanup(open('lists.plt', write, Out),
                      make_tests(lists, 'queries.pl', Out),
                      close(Out)).
Out = <stream>(0xe59ef0).

?- halt.
$ cat lists.plt 
:- begin_tests(lists).

test(member, [nondet]) :-
    member(a, [a, b]).
test(member, [all(A==[a, b])]) :-
    member(A, [a, b]).

:- end_tests(lists).