我刚刚开始尝试与Pyswip进行整合,尝试将Prolog知识库集成到Python程序中。在我尝试获取列表的价值之前,它似乎运行得很顺利。仅举例说明问题:
In [1]: from pyswip import Prolog
In [2]: p = Prolog()
In [3]: p.assertz("father(andrew, [burt, carol])")
In [4]: sol = p.query("father(andrew, X)")
In [5]: a = next(sol)
In [6]: a
Out[6]: {'X': [Atom('441093'), Atom('441221')]}
关于如何获得真实答案的任何想法?
答案 0 :(得分:0)
好像您打过Issue #16,用Python3更新到最新版本的PySWIP应该可以解决(关于Python2的问题,some mutterings仍然存在)。 / p>
答案 1 :(得分:0)
字符串内容实际上包含在Atom对象中,唯一的问题是并不总是执行必要的自动转换为Python字符串的操作。在这种情况下,您可以手动执行转换。
例如,在打印列表时不执行转换,但是在打印单个元素时显示字符串内容:
from pyswip import Prolog
p = Prolog()
p.assertz("father(andrew, [burt, carol])")
sol = p.query("father(andrew, X)")
a = next(sol)
print(a)
# {'X': [Atom('392453'), Atom('392581')]}
print(a['X'][1])
# carol
使用in
查找子字符串需要手动转换:
name = a['X'][1]
if "aro" in name: # TypeError: argument of type 'Atom' is not iterable
if "aro" in str(name): # ok
转换示例代码的完整结果字典:
a = {variable: [str(elem) for elem in a[variable]] for variable in a}
print(a)
# {'X': ['burt', 'carol']}