使用PySwip从python查询Prolog数据库

时间:2019-07-25 17:58:27

标签: 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('+', 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"])

什么都没发生。有人知道为什么这行不通吗?

1 个答案:

答案 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"])