在为这个问题奋斗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页面上阅读编译页面,但感到困惑。 我无法在标准输出流上打印任何内容。 我也不明白旗帜是如何运作的。
尝试了他们在swi-prolog网站上的例子,但我不明白为什么没有打印。 使用下面的脚本,我可以使用命令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)
]).
答案 0 :(得分:4)
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
答案 1 :(得分:3)
我将引用eight_puzzle.pl,我为another answer发布的模块作为测试用例。然后我用一个测试参数行用法编写一个新文件(比如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 Compilation
中的文档部分2.10.2.4swipl -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