使用PySwip从python查询Prolog数据库

使用PySwip从python查询Prolog数据库,python,prolog,Python,Prolog,我已经用Prolog编写了一个程序,我想用python访问它的结果。我曾尝试使用pyDatalog编写代码,但遇到了一个无法解决的问题。现在我正在尝试PySwip,因为它可以让我查阅我已经创建的数据库 下面是我的知识库的样子 con('w1',a,c). con('w2',c,b). con('w3',b,d). con('w4',d,a). up('w1'). up('w3'). down('w2'). down('w4'). check(X,Y):-up(X),atom_concat('

我已经用Prolog编写了一个程序,我想用python访问它的结果。我曾尝试使用pyDatalog编写代码,但遇到了一个无法解决的问题。现在我正在尝试PySwip,因为它可以让我查阅我已经创建的数据库

下面是我的知识库的样子

con('w1',a,c).
con('w2',c,b).
con('w3',b,d).
con('w4',d,a).

up('w1').
up('w3').
down('w2').
down('w4').

check(X,Y):-up(X),atom_concat('+', X, Y).

check(X,Y):-down(X),atom_concat('-', X, Y).

comb(Output,Input,A,B):- con(X,A,B), check(X,Y), append([Y],Input,Output).

comb(Output,Input,A,B):- comb(Out,Input,A,C),con(X,C,B), check(X,Y), append([Y],Out,Output).
如果我在SWI Prolog中查询
comb(O,[],a,b)。
结果是
O=['-w2','+w1']

现在在python中,我使用PySwip检索查询结果。作为测试,我运行了下面的代码,得到了预期的结果
acc

from pyswip import Prolog
prolog = Prolog()
prolog.consult("knowledge_base.pl")
for soln in prolog.query("con('w1',B,C)"):
    print(soln["B"],soln["C"])
但是当我运行下面的代码时

from pyswip import Prolog
prolog = Prolog()
prolog.consult("knowledge_base.pl")
for soln in prolog.query("comb('O',[],a,b)"):
    print(soln["O"])

什么也没发生。有人知道这为什么不起作用吗?

在pyswip对
O
的查询中,您将它定义为一个原子,将它括在单引号中,您需要它是一个变量

from pyswip import Prolog
prolog = Prolog()
prolog.consult("knowledge_base.pl")
# Atom 'O': for soln in prolog.query("comb('O',[],a,b)"):
# Should be:
for soln in prolog.query("comb(O,[],a,b)"):
    print(soln["O"])

您是否绝对确定需要将Python和Prolog直接联系起来以解决您的问题?看起来用一种或另一种语言来完成整件事可能会更容易。@DanielLyons,我可能可以用python来写,这是我正在研究的东西。碰巧prolog对它的一部分来说似乎很方便,我想如果我能成功地将它与python结合起来会很有趣。现在正在返回一组无穷无尽的数组,从这个
[Atom('602373')、Atom('416389')]
开始,然后它们变长了。这不是我所期望的结果。这是PySWIP中一个已知且已修复的问题,可以通过更新来修复,请参阅PySWIP Github上的。