swi-prolog编译的.exe可以接受参数的示例



在解决问题4个小时后,我将感谢您的帮助

我需要从prolog脚本创建一个exe文件(在windows上)。例如,main.pl内部有:

day(monday).
day(tuesday).
day(wednesday).
day(thursday).
day(friday).    % let's stop here

我想编译这个脚本,生成prog.exe文件,然后然后能够进行以下运行:

$ prog.exe --term sunday
 false
$ prog.exe --term monday
 true
$ prog.exe --goal day(friday)
 true
$ prog.exe --goal fun(foo)
 false

如果标志是有输入目标的非标志版本对我也很有帮助。

我试着在swi-prolog页面上阅读编译页面,但被弄糊涂了。我无法在标准输出流上打印任何内容。我也不明白flags是如何工作的。

尝试了他们在swiprolog网站上的例子,但我不明白为什么什么都没有打印出来。使用下面的脚本,我可以用命令save(prog)创建exe文件,但在运行prog.exe时,不会打印出任何内容。

:- ['main'].
main :-
        pce_main_loop(main).
main(Argv) :-
        write('hello word').
save(Exe) :-
        pce_autoload_all,
        pce_autoload_all,
        qsave_program(Exe,
                      [ emulator(swi('bin/xpce-stub.exe')),
                        stand_alone(true),
                        goal(main)
                      ]).

SWI Prolog包含可用于命令行参数解析的optparse库。

opts_spec(
    [ [opt(day), type(atom),
        shortflags([d]), longflags(['term', 'day']),
        help('name of day')]
    , [opt(goal),
        shortflags([g]), longflags([goal]),
        help('goal to be called')]
    ]
).
% days
day(monday).
day(tuesday).
day(wednesday).
day(thursday).
day(friday).

main :-
    opts_spec(OptsSpec),
    opt_arguments(OptsSpec, Opts, _PositionalArgs),
    writeln(Opts),
    memberchk(day(Day), Opts),
    memberchk(goal(Goal), Opts),
    (nonvar(Day) -> call_call(day(Day), Result), writeln(Result) ; true),
    (nonvar(Goal) -> call_call(Goal, Result), writeln(Result) ; true),
    halt.
call_call(Goal, true) :-
    call(Goal), !.
call_call(_Goal, false).

您可以像这样编译和使用上面的代码。(仅在Ubuntu上测试,对不起,我无法帮助有关Windows。)

$ swipl -o day.exe -g main -c day.pl
$ ./day.exe --term monday
[goal(_G997),day(monday)]
true
$ ./day.exe --goal "day(sunday)"
[day(_G1009),goal(day(sunday))]
false

我将参考eight_puzzle.pl,这是我发布的另一个答案模块,作为测试用例。然后,我编写了一个新文件(比如p8.pl),其中包含测试参数行用法,编译并运行

:- use_module(eight_puzzle).
go :-
    current_prolog_flag(argv, Argv),
    writeln(argv:Argv),
    (   nth1(Test_id_flag, Argv, '--test_id'),
        Test_id_pos is Test_id_flag+1,
        nth1(Test_id_pos, Argv, Id)
    ->  atom_concat(test, Id, Func)
    ;   Func = test1
    ),
    forall(time(call(eight_puzzle:Func, R)), writeln(R)).

为了进行编译,我使用了2.10编译中的第2.10.2.4节文件

swipl -O --goal=go --stand_alone=true -o p8 -c p8.pl

并使用指定选项运行:

./p8 --test_id 0

我正在运行Ubuntu,但在Windows上应该没有区别。

argv:[./p8,--test_id,0]
% 4,757 inferences, 0.003 CPU in 0.003 seconds (100% CPU, 1865842 Lips)
[4,3,6,7,8]
% 9,970 inferences, 0.005 CPU in 0.005 seconds (100% CPU, 2065656 Lips)
[4,3,6,7,4,5,8,7,4,5,8,7,4,5,8]
...

HTH

相关内容

  • 没有找到相关文章

最新更新