小编Fib*_*sky的帖子

运行SWI-Prolog二进制文件而不在机器上安装swipl

我想在没有安装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制作二进制helloSWI-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权限.

binaryfiles swi-prolog

10
推荐指数
1
解决办法
293
查看次数

冒号(:)在Swi-Prolog中完全代表什么?

我无法明确找到(:)代表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)

prolog colon

6
推荐指数
1
解决办法
1909
查看次数

swi-prolog 中的多线程有一点改进

我有一个执行繁重计算的代码: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/1write/1copy_term/2等。

multithreading prolog swi-prolog

6
推荐指数
1
解决办法
204
查看次数

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

在为这个问题挣扎了 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)

arguments exe prolog swi-prolog xpce

5
推荐指数
2
解决办法
2703
查看次数

检测 Prolog Term 是否被指定的谓词(变得更具体)

是否可以使用已经内置的谓词(在 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)

prolog

1
推荐指数
1
解决办法
185
查看次数

标签 统计

prolog ×4

swi-prolog ×3

arguments ×1

binaryfiles ×1

colon ×1

exe ×1

multithreading ×1

xpce ×1