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

标签 prolog arguments exe swi-prolog xpce

在花了 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)
                      ]).

最佳答案

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

关于prolog - 由 swi-prolog 编译的可以接受参数的 .exe 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14764740/

相关文章:

c - 将变量传递给函数会更改 C 中的地址位置

python - 在 python 脚本中嵌入图标

Prolog 同构图

javascript - 在 while 循环中使用 php 字符串作为 javascript 函数的参数

R:函数参数和 lapply 嵌套在函数中或使用 data.table 从外部函数调用

java - 使用maven将java文件打包成exe for windows

wix - 将命令行参数传递给 WiX 自定义操作

prolog - 更好地理解序言

prolog - 序言中对称关系的传递闭包

c++ - 将 SWI-Prolog 连接到 C++ 的问题