我想在没有安装prolog的机器上运行swi-prolog程序(实际上是服务器).
序言代码swipl_test.pl:
main :- write('Hello, world\n').
Run Code Online (Sandbox Code Playgroud)
在本地机器4.4.0-64-generic #85~14.04.1-Ubuntu SMP Mon Feb 20 12:10:54 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux制作二进制hello有SWI-Prolog version 7.2.3 for amd64:
swipl --goal=main --toplevel=halt --stand_alone=true --foreign=save -o hello1 -c swipl_test.pl
Run Code Online (Sandbox Code Playgroud)
移动hello远程计算机2.6.32-5-amd64 #1 SMP Wed Jun 17 16:09:06 UTC 2015 x86_64 GNU/Linux会出现以下错误:
error while loading shared libraries: libswipl.so.7.2: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
如何从prolog代码中准备一个自包含的二进制文件?我在远程计算机上没有sudo权限.
我无法明确找到(:)代表prolog.
在交互模式中,您可以看到以下证据:
?- display(a:b).
:(a,b)
true.
?- display([a,b,c]).
.(a,.(b,.(c,[])))
true.
?- display(a:b:c:[]).
:(a,:(b,:(c,[])))
true.
?- a:b:REST = a:TAIL.
TAIL = b:REST.
Run Code Online (Sandbox Code Playgroud)
出于什么目的(:)引入?我在www中找不到任何细节.似乎它提供了另一种将递归结构称为列表的句法方式.
我们可以说它是右关联的,它的优先级是多少?
:-op(??, xfy, :).
Run Code Online (Sandbox Code Playgroud)
有没有办法列出所有这类隐式仿函数?
listing(op). %of course this does not work
Run Code Online (Sandbox Code Playgroud) 我有一个执行繁重计算的代码:pred(In, Out)假设执行64K 次,每次执行需要 1-10 秒。
我想使用多线程(64)机器来加快进程。我concurrent_maplist为此使用:
concurrent_maplist(pred, List_of_64K_In, List_of_64K_Out).
我得到了大约 8 倍的加速,但不会超过这个速度。我认为原因是以下通知concurrent_maplist:
请注意,此谓词的开销相当大,因此在达到加速之前,目标必须相当昂贵。
为了使目标相当昂贵,我将代码修改为:
% putting 1K pred/2 in heavy_pred/2
concurrent_maplist(heavy_pred, List_of_64_List_of_1k_In, List_of_64_List_of_1k_Out).
heavy_pred(List_of_In, List_of_Out) :-
maplist(pred, List_of_In, List_of_Out).
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是(对我而言),我没有进一步加快这种变化。
我想知道如何通过多线程进一步加快速度?
一些额外的细节:
架构:x86_64, AMD, 14.04.1-Ubuntu。
swipl -v: SWI-Prolog version 6.6.4 for amd64.
pred/2 是一个定理证明器,它采用公式并试图证明它们。它采用标准的谓词很少非标准的:cyclic_term/1,write/1,copy_term/2等。
在为这个问题挣扎了 4 个小时后,我将不胜感激:
我需要从 prolog 脚本创建一个 exe 文件(在 Windows 上)。例如,main.pl 里面有:
day(monday).
day(tuesday).
day(wednesday).
day(thursday).
day(friday). % let's stop here
Run Code Online (Sandbox Code Playgroud)
我想编译这个脚本,生成 prog.exe 文件,然后能够执行以下运行:
$ prog.exe --term sunday
false
$ prog.exe --term monday
true
$ prog.exe --goal day(friday)
true
$ prog.exe --goal fun(foo)
false
Run Code Online (Sandbox Code Playgroud)
如果标志很困难,带有输入目标的非标志版本对我也非常有帮助。
我试图阅读 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)
]).
Run Code Online (Sandbox Code Playgroud) 是否可以使用已经内置的谓词(在 swi-prolog 中)获取谓词,例如:
Wanted_Pred(X, a) %false
Wanted_Pred(b, a) %false
Wanted_Pred(X, Y) %true
Wanted_Pred(X, X) %true
Wanted_Pred(X, [Y|Z]) %false
Wanted_Pred([A|B], [X,Y|Z]) %false
Wanted_Pred([A,C|B], [X,Y|Z]) %true
Run Code Online (Sandbox Code Playgroud)
例如,如果两个参数都代表彼此的自由变量重命名,则成功,请注意,copy_term 不会这样做,因为它最终统一了参数:
copy_term(X, a) %true
copy_term(X, [Y|Z]) %true
copy_term([A|B], [X,Y|Z]) %true
Run Code Online (Sandbox Code Playgroud)