基于一些较旧的post https://stackoverflow.com/questions/63890053/prolog-define-logical-operator-in-prolog-as-placeholder-for-other-operator,我有一些序言程序,它指定了命题。我们称之为“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 为此目的提供的库是 pyswip。
我现在这个库的问题是 swipl 函数交叉点/3 https://www.swi-prolog.org/pldoc/man?predicate=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]