标签: swi-prolog

SWI Prolog更改工作目录/获取当前工作目录?

在SWI Prolog终端中,如何查看当前工作目录并更改当前工作目录?

我发现:

working_directory(CWD,CWD)

但我不认为它是我需要的

swi-prolog

11
推荐指数
2
解决办法
2万
查看次数

Prolog:制作打印Hello World的程序

我想将这个简单的东西加载到我的编辑器中:

Write:-repeat,write("hi"),nl,fail.
Run Code Online (Sandbox Code Playgroud)

所以它打印"hi".

我该怎么办?

我现在正在尝试做 File->New

并保存名为Write的文件 E:\Program Files\pl\xpce\prolog\lib

在进行查询时:

?-写.

这是打印:

1 ?- Write.
% ... 1,000,000 ............ 10,000,000 years later
% 
%       >> 42 << (last release gives the question)
Run Code Online (Sandbox Code Playgroud)

为什么?

procedure swi-prolog prolog-toplevel

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

在swi-prolog中汇总/ 3

我需要统计所有这些X,some_predicate(X)而且真的有很多这样的X.最好的方法是什么?

第一个线索是找到所有,累积到列表并返回它的长度.

countAllStuff( X ) :-
    findall( Y
           , permutation( [1,2,3,4,5,6,7,8,9,10], Y )
           , List
           ),
    length( List, X ).
Run Code Online (Sandbox Code Playgroud)

(permutation/2仅显示存在许多变体的示例,并且收集所有变量的方法很糟糕)

显然,我有堆栈溢出.

?- countAllStuff( X ).
ERROR: Out of global stack
Run Code Online (Sandbox Code Playgroud)

不是,我试图取代findallsetof并没有什么变化.

最后,我创建了aggregate(可点击的)谓词并尝试使用它.

?- aggregate(count, permutation([1,2,3,4], X), Y ).
X = [1, 2, 3, 4],
Y = 1 .

?- aggregate(count, [1,2,3,4], permutation([1,2,3,4], X), Y ).
X = [1, 2, 3, 4],
Y = 1 ; …
Run Code Online (Sandbox Code Playgroud)

prolog swi-prolog

10
推荐指数
3
解决办法
5431
查看次数

运行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的语义Web库查询RDF/OWL?

如何使用SWI-Prolog语义Web库查询OWL/RDF文件并提取一些信息?

OWL/RDF文件包含有关所有Debian软件包的信息,因此我需要进行查询以查找软件包依赖项.

例如:

OWL文件的结构如下:

package: A

Depends:

package: B

pacakge: C
Run Code Online (Sandbox Code Playgroud)

如何将OWL/RDF文件加载到Prolog脚本中,在Prolog脚本中进行查询的语法是什么,以便将A作为参数并且脚本输出B和C?

rdf semantic-web owl prolog swi-prolog

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

是否有可以绘制Prolog查询搜索树的程序?

我想知道是否存在可以绘制Prolog程序的逐步搜索树的工具?谢谢.

prolog swi-prolog search-tree

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

与SWI-Prolog的Python接口

我想使用Python脚本作为使用SWI-PL引擎的Prolog程序的前端.

因此,设置的组件是:

我一直在寻找SWI-PL和Python之间的接口.我发现的是:

PySwip但似乎缺乏我在这里看到的旧问题,而且似乎也没有支持.

PyLog,看起来更新但也有一些活动.虽然我不知道它有多好.

使用Python与SWI-prolog通信的推荐方法是什么?是否有其他方法可以实现这一目标?也许与另一个prolog引擎?

我坚持使用Prolog语言和Python,因为我最了解它们,所以这是必要的(我知道例如也有Java工具).

python prolog swi-prolog

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

是否有Prolog的包管理器?

我想知道与其他程序员共享Prolog代码/库的最佳实践(以及多个项目之间的自己).我自己也在使用SWI-Prolog,但也对其他Prolog如何解决这个问题感兴趣.

相比之下,Java有Maven + JAR,Python有EasyInstall + PythonEggs,其他语言可能还有很多其他语言.但Prolog还有吗?

SWI-Prolog包

在SWI-Prolog中有Packs,由模块支持library(prolog_pack).这些的缺点是:

  1. 您必须为每个包创建存档文件或Git存储库.说我想创建10包.现在我需要创建10个Git存储库.我有时会编辑影响多个文件,可能驻留在多个包/ repos中,要求我为单个(多文件)编辑提交几个Git存储库.
  2. 为了创建一个包,你必须手工挑选一些"属于一起"的文件.有时候我发现文件X属于包A和包B.现在我需要在存储库A和B中维护文件X的副本,或者我需要创建另一个包C只包含X和导入C到A和B.
  3. 包在公共网站上发布.我的大部分图书馆对我来说都很有趣.其中一些对我与之合作的特定人员很有意思,只有少数人准备好进行更广泛/公开的传播.
  4. 包维护者必须指定包间依赖关系.对于复杂的图书馆等级,对我来说似乎是不必要的工作.我已经非常严格地使用Prolog模块,并且只想使用Prolog模块导入的层次结构作为依赖图.

Git子模块

另一种我直到现在使用过的方法是Git子模块.通过将一个存储库导入另一个存储库来实现库之间的依赖关系.这与SWI-Prolog包有一些相同的缺点:

  1. 每个库的Git存储库,因此需要维护大量存储库.
  2. 维护者必须明智地选择每个repo的文件,并且必须指定需要哪些Git子模块包含.
  3. 更新现有库非常困难.我发现(困难的方法)我交给代码的大多数人都无法成功更新具有许多错综复杂的相互依赖的子模块导入的Git存储库.(我非常尊重偶尔使用子模块的Git大师并且总是把它做对,但是大多数非程序员和我工作的很多程序员都觉得它太难了.)

我的理想方法

我个人对完美的Prolog代码共享方法的偏好是:

  1. 您传播的库的数量和您拥有的Git存储库的数量是独立的.具体来说,我可以有一个相当大的存储库,其中的一部分以不同的方式传播.如果有人喜欢(重新)使用我的Prolog模块和DCG帮助器谓词,那么我可以简单地向该人传播该单个文件(加上潜在的依赖关系).
  2. 您不必亲自挑选和手动复制单个文件,而是让算法遍历模块导入的层次结构以提取(显然)属于一起的文件.首次运行程序时会下载文件.这些文件可能都属于同一个Git存储库或多个存储库,算法根本不关心存储库和库之间或存储库和文件之间的映射.
  3. 代码的维护者能够决定一个库是公开发布还是发布给有限的一组人(或者只限于包括维护者在内的有限组).
  4. 文件之间的模块导入层次结构是依赖关系跟踪所需的全部内容.

以上暗示我理想的库共享方法是基于文件的,而不是基于包的.如果Prolog模块A使用Prolog模块B并且加载了A,则从本地文件(如果存在)加载B或从存储库下载B. 我不确定基于文件的方法在其他语言中有多常见.前面提到的Maven + JAR和EasyInstall + PythonEggs都是基于包的.

我对其他Prolog程序员使用和思考这个主题非常感兴趣!

module package-managers prolog swi-prolog git-submodules

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

(SWI)Prolog作为NoSQL平台怎么样?

我希望看到(SWI)Prolog宣传为NoSQL'认真的竞争者'.

(SWI)Prolog拥有令人敬畏的数据绑定功能,当然还有很多功能来编写针对这些大数据的逻辑.

随着最近的PLGI贡献,编写一个复杂的Gnome GUI变得非常简单...... NoSQL研究员最期待哪些功能?RDF的反应性CRUD如何发声?

我已经测试了运行几个Gnome接口的PLGI - 像GtkClutter这样的标准,或者像graph_gtk一样自编(图形编辑器,我从 -gtk 移植它,同时学习本机GIntrospection和GObject/GtkWidgets基础......我想我'我准备以声明的方式绑定Gtk - 或者通常是GObjects.

database rdf prolog swi-prolog plgi

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

折叠部分列表

这是一个已经删除的问题答案引发的问题.该问题可归纳如下:

是否可以折叠列表,折叠时生成列表的尾部?

这就是我的意思.假设我想计算阶乘(这是一个愚蠢的例子,但它仅用于演示),并决定这样做:

fac_a(N, F) :-
        must_be(nonneg, N),
        (       N =< 1
        ->      F = 1
        ;       numlist(2, N, [H|T]),
                foldl(multiplication, T, H, F)
        ).

multiplication(X, Y, Z) :-
        Z is Y * X.
Run Code Online (Sandbox Code Playgroud)

在这里,我需要生成我给出的列表foldl.但是,我可以在常量内存中执行相同的操作(不生成列表而不使用foldl):

fac_b(N, F) :-
        must_be(nonneg, N),
        (       N =< 1
        ->      F = 1
        ;       fac_b_1(2, N, 2, F)
        ).

fac_b_1(X, N, Acc, F) :-
        (       X < N
        ->      succ(X, X1),
                Acc1 is X1 * Acc,
                fac_b_1(X1, N, Acc1, …
Run Code Online (Sandbox Code Playgroud)

prolog fold swi-prolog meta-predicate

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