使用PySwip从python查询Prolog数据库
我已经用Prolog编写了一个程序,我想用python访问它的结果。我曾尝试使用pyDatalog编写代码,但遇到了一个无法解决的问题。现在我正在尝试PySwip,因为它可以让我查阅我已经创建的数据库 下面是我的知识库的样子使用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('
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上的。