Python: swiplserver 加载 prolog 文件

Python: swiplserver load prolog file

基于此 尝试按照提示设置一些 swiplserver

from pyswip import Prolog, Functor, Query
from swiplserver import PrologMQI, PrologThread


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

with PrologMQI() as mqi:
    with mqi.create_thread() as prolog_thread:
        result = prolog_thread.query("member(X, [color(blue), color(red)])")
        print(result)

我现在的问题,我不知道如何加载“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).

进入该服务器设置,这样我就可以使用语句:

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

有没有办法使用类似于 pyswip 的咨询命令的“logic.pl”?

对我来说,解决方案是传递文件的完整路径(只是为了确保还导入并使用一个名为 create_posix_path() 的方法),然后它对我来说一切正常:

from swiplserver import PrologMQI, PrologThread, create_posix_path

with PrologMQI() as mqi:
    with mqi.create_thread() as prolog:
        path = create_posix_path("C:\full\path\to\file.pl")
        prolog.query(f'consult("{path}").')
        result = prolog.query('some_query(X)')
        print(result)

[从 swi-prolog.discourse.group 上相同的交叉发布问题复制而来

我认为学习如何使用 swiplserver 的一个好方法是首先找出使用 Prolog 命令行(即“顶级”)工作的正确查询集,然后将其转换为Python.

由于 logic.pl 包含多字节字符并且我使用的是默认情况下未设置编码的 Macintosh,我需要:

  • 将此放在 logic.pl 的顶部::- encoding(utf8).
  • 在文件的顶部放置一个字节顺序标记
  • 先致电 set_prolog_flag(encoding,utf8).(我选择这样做)

一旦我设置了编码,它似乎至少有 运行(我不确定 false 是否是最后一条语句的正确结果,因为我没有尝试解码什么logic.pl 正在做...):

[debug] ?- set_prolog_flag(encoding,utf8).
true.

[debug] ?- consult("/Users/ericzinda/test/logic.pl").
true.

[debug] ?- result = intersection([A,(A→B)], [p, (p→q)], Aim).
false.

开始将其转换为 swiplserver 的最简单方法是从字面上获取命令并将它们转换为字符串:

# test.py
from swiplserver import *

with PrologMQI() as mqi:
    with mqi.create_thread() as prolog_thread:
        result = prolog_thread.query("set_prolog_flag(encoding,utf8).")
        print(result)
        result = prolog_thread.query("consult(\"/Users/ericzinda/test/logic.pl\").")
        print(result)
        result = prolog_thread.query("result = intersection([A,(A→B)], [p, (p→q)], Aim).")
        print(result)
Macintosh 命令行上的

运行 给出与 Prolog 命令行相同的结果:

% python3 test.py
True
True
False

%

一旦一切顺利,就值得考虑 Prolog 与 Python 代码之间的接口。您应该尽量避免“喋喋不休”的界面(有一堆来回 low-level 调用的界面)。尝试将您正在做的事情封装在更高级别的谓词中,这些谓词可以完成更大的工作并调用它们。编写和调试代码会更容易,而且速度可能也会更快一些,因为您不会产生来回发送信息的成本。