5

我有一些.pl文件,我想从 python 脚本调用在其中声明的谓词。我怎样才能做到这一点?

例如,test.pl

rD( [], Ans, Ans ).
rD( [X|Xs], Ans, Acc ) :-
    member( X, Acc ),
    rD( Xs, Ans, Acc ), !.
rD( [X|Xs], Ans, Acc ) :-
    \+member( X, Acc ),
    append( Acc, [X], AccNew ),
    rD( Xs, Ans, AccNew ), !.

像这样工作

?- rD( [1,2,3,4,5,4], X ).
X = [1, 2, 3, 4, 5].

我想以rD某种方式从 python 脚本调用并在结果变量中得到答案

result
[1, 2, 3, 4, 5]

ps:这只是一个例子,我不想重写我现在的Prolog程序。

4

4 回答 4

4

并不是说我对它有直接的经验,而是有一个名为PySWIP的项目提供了 Python 和 SWI-Prolog 之间的桥梁。托管在 Google Code 项目页面上的wiki包含安装说明和一些使用示例

编辑(2019 年 7 月 5 日)

PySWIP 现在似乎在Github上维护,有自己的安装说明。TLDR:安装 SWI-Prolog 并且pip install pyswip应该为 Python 2 和 3 完成这项工作。

于 2011-05-23T22:09:16.530 回答
3

由于您不想“重写我当前的 Prolog 程序”,我认为自然的方法是从 Python 对 SWI-Prolog 进行外部调用,并传递适当的命令行参数。

看看这个 SO 讨论,如何在 Python 中调用外部命令,从 2008 年 9 月开始。使用该subprocess模块允许来自外部命令的标准输出通过管道传输到 Python 进程并在那里作为流读取。

这减少了为 SWI-Prolog选择命令行参数的问题。可以通过类 Unix 系统上的 shell 脚本或 Windows 上的“DOS”批处理/cmd 文件间接调用 SWI-Prolog,但我将省略进一步提及这种间接调用。

尤其参见第 2 节中的讨论。SWI-Prolog 手册(上面链接)的 2.4.2-g-t选项。例如:

swipl --quiet -t rD( [1,2,3,4,5,4], X ),halt

可能会做你想做的事。该--quiet选项会抑制横幅/欢迎消息,您可能希望简化对 Python 接收到的输出的解析。

于 2011-05-25T13:27:54.213 回答
2

Python3 的更新,在撰写本文时 PyPI 中的 PySwip 仅适用于旧版 Python,但github 上的源代码与Python3 兼容。你可以 git clone 这个,运行python3 setup.py install它,它会给你一个 Python3 版本。

要查阅存储为 Knowledge_base.pl 的现有知识库:

from pyswip import Prolog
prolog = Prolog()
prolog.consult("knowledge_base.pl")
for res in prolog.query("rD( [1,2,3,4,5,4], X )."):
    print(res)

# output:
# {'X': [1, 2, 3, 4, 5]}
于 2018-05-19T21:57:16.537 回答
-1
from subprocess import Popen, PIPE, STDOUT

p = Popen('/usr/local/sicstus4.2.3/bin/sicstus', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT)
cmd = open('/path/to/your/test.pl').read()
res = p.communicate(cmd)
for line in res:
    print line
于 2013-01-28T22:33:52.713 回答