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

时间:2016-02-12 07:05:45

标签: 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).

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

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).

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

1 个答案:

答案 0 :(得分:6)

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

  1. 模块
  2. 来自的文件 ,查询已读
  3. 的流<生成的测试已写
  4. 在您使用的示例中,您可以将输出流设置为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).