python - 有没有办法在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 终端中。有什么办法吗?
解决方案
对我来说,它的行为如下:
>>> 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'}]
推荐阅读
- xml - xmlstarlet 不更新内容
- ios - 没有捐赠的 Siri 意图在设置中不可见
- jenkins - 使用 Jenkins 设置 gitea 提交状态
- ruby - 下拉菜单刮红宝石
- influxdb - 您的查询在语法上是正确的,但没有返回任何结果
- c# - 接口注入无法访问祖父方法,在运行时遇到 RuntimeBinderException
- ios - 未注册的注册令牌(firebase ios)
- asp.net-core-mvc - System.InvalidOperationException:尝试激活“HomeController”时无法解析“LoginManager”类型的服务
- javascript - Nuxt.js- 持久化数据的共享链接:接收者如何查看数据?
- python - 继承:来自父类的属性