我已经在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检索查询结果。作为测试,我运行了以下代码,并得到了预期的结果a c
。
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"])
什么都没发生。有人知道为什么这行不通吗?
答案 0 :(得分:0)
在O
的pyswip查询中,您已经通过将其用单引号引起来将其定义为原子,您需要将其作为变量
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"])