在pyswip中获取列表作为Aswer的问题

时间:2019-09-17 06:49:59

标签: python prolog

我刚刚开始尝试与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')]}

关于如何获得真实答案的任何想法?

2 个答案:

答案 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']}