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

Ash*_*Ash 3 prolog swi-prolog

我正在尝试将输出写入make_tests文件,但我尝试过的任何内容似乎都没有在输出文件中插入正确的信息.

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

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

:- 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).
Run Code Online (Sandbox Code Playgroud)

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

init_test_file('mytest.pro').
member(a, [a,b]).
gen_test_in('mytest.pro').
Run Code Online (Sandbox Code Playgroud)

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

true.

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

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

:- end_tests(lists).
true.
Run Code Online (Sandbox Code Playgroud)

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

我尝试过修改gen_test_in为:

gen_test_in(FILE) :-
   open(FILE, write, Out),
   make_tests(lists, FILE, Out),
   close(Out).
Run Code Online (Sandbox Code Playgroud)

但我只是得到一个空文本文件.

小智 6

你在弄乱这里的论点.您正在使用的库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]).
Run Code Online (Sandbox Code Playgroud)

然后:

$ 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).
Run Code Online (Sandbox Code Playgroud)