首页 > 解决方案 > 有没有办法在python中打印它(python在prolog上桥接)?

问题描述

我正在尝试使用 pyswip 从 python 程序运行 prolog 查询。假设我有这样的程序,

from pyswip import Prolog
p = Prolog()
p.retractall('rule1(_,_)')
p.retractall('rule2(_,_)')
p.retractall('rule3(_,_)')
p.assertz('rule2(X):- writeln(\'in rule2\': X)')
p.assertz('rule1(X,Y):- rule2(X), writeln(\'rule2 exectued\'),rule3(Y)')
p.assertz('rule3(Y):- writeln(\'in rule3\': Y)')
print(list(p.query('rule1(1,2)')))

现在我想要的是所有将在 prolog 中打印的 writeln 规则,我希望将其打印在 python 终端中。有什么办法吗?

标签: pythonprologffiswi-prolog

解决方案


对我来说,它的行为如下:

>>> print(list(p.query('rule1(1,2)')))
in rule2:1
rule2 exectued
in rule3:2
[{}]

您的writeln语句按预期执行,输出将打印到 Python 终端。输出对你来说不同吗?你想让它与众不同吗?

编辑(见下面的评论):当 Python 不是直接在终端中运行,而是在 Jupyter 笔记本或类似设备中运行时,Prolog 输出可能会丢失。在这种情况下,可以将 Prolog 查询包装在 中with_output_to(atom(PrologOutput), ...),这将在原子(Python 字符串)中捕获 Prolog 代码的输出:

>>> print(list(p.query('with_output_to(atom(PrologOutput), rule1(1,2))')))
[{'PrologOutput': 'in rule2:1\nrule2 exectued\nin rule3:2\n'}]

推荐阅读