Python:pyswp输出返回Atom和Functor

2022-02-26 00:00:00 python logic intersection prolog

问题描述

基于一些较早的post,我有一些PROLOG程序,它指定命题。让我们称其为";logic.pl";

:-op(800, fx, ¬).
:-op(801, xfy, ∧).
:-op(802, xfy, ∨).
:-op(803, xfy, →).
:-op(804, xfy, ↔).
:-op(800, xfy, #).


m_Proposition_Binary_x_y(X ∨ Y, X, Y).
m_Proposition_Binary_x_y(X ∧ Y, X, Y).
m_Proposition_Binary_x_y(X → Y, X, Y).
m_Proposition_Binary_x_y(X ↔ Y, X, Y).

m_Proposition(X) :-
    m_Proposition_Atom(X).
m_Proposition(Binary) :-
    m_Proposition_Binary_x_y(Binary, X, Y),
    m_Proposition(X),
    m_Proposition(Y).
m_Proposition(¬ X) :-
    m_Proposition(X).



m_Proposition_Atom(p).
m_Proposition_Atom(q).
我现在的目标是基于python程序处理一些Prolog函数。Python为此提供的库是pyswp。

这个库现在的问题是swpl函数intersection/3。如果我运行例如此函数

intersection([A,(A→B)], [p, (p→q)], Aim).

从SWI-Prolog手动获取所需的输出:

A = p,
B = q,
Aim = [p, p→q].

但在python代码中:

from pyswip import Prolog


prolog = Prolog()
prolog.consult("logic.pl")

for res in prolog.query("intersection([A,(A→B)], [p, (p→q)], Aim)."):
    print(res)

我的输出是:

{'A': 'p', 'B': 'q', 'Aim': [Atom('331781'), Functor(8343821,2,p,q)]}

我现在的问题是,原因是什么:

'Aim': [Atom('331781'), Functor(8343821,2,p,q)] 

是否有办法将其转换为我的预期输出?

Aim = [p, p→q]

解决方案

我只是找到了一些答案。我刚刚使用

安装了最新的稳定版本0.2.10
pip install pyswip
在github-page版本0.2.11中,此问题应得到解决。您可以通过以下命令安装0.2.11:

pip install git+https://github.com/yuce/pyswip@master#egg=pyswip

我现在的输出是:

[{'A': 'p', 'B': 'q', 'Aim': ['p', '→(p, q)']}]

相关文章