将 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
中,您有以下三个参数:
- 模块
- 来自的文件读取
- 流到生成的测试是写入
在您使用的示例中,您要么将输出流设置为 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).
我正在尝试将 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
中,您有以下三个参数:
- 模块
- 来自的文件读取
- 流到生成的测试是写入
在您使用的示例中,您要么将输出流设置为 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).