【问题标题】:Is there any way to print it in python(python bridging on prolog)?有没有办法在python中打印它(python在prolog上桥接)?
【发布时间】:2020-06-29 09:50:49
【问题描述】:

我正在尝试使用 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 终端中打印。有什么办法吗?

【问题讨论】:

  • 当前运行时它会做什么?
  • 什么都不打印,空列表。输出:- [ { } ]

标签: python prolog ffi swi-prolog


【解决方案1】:

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

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

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

编辑(参见下面的 cmets):当 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'}]

【讨论】:

  • 我跑了,但它没有打印输出它只打印代码的最后一行。它是为您打印的吗?
  • 是的。具体来说,如果我将您的代码放入文件foo.py 并运行python foo.py,我会得到三行Prolog 输出,然后是来自Python 的[{}]。我有 Python 3.6.9、pyswip 0.2.10 和 SWI-Prolog 7.6.4。
  • 是的,它非常有效。但是有一件事我无法理解,当我在带有 .ipynb 扩展名的文件中的 jupyter notebook 上运行此代码时,它并没有像我之前所说的那样工作。但是当我在 linux 终端上运行带有 .py 扩展名的代码时,它就可以工作了。
  • 啊,你应该马上说你在终端中使用的是 Jupyter,而不是“真正的”Python。您可以尝试以p.query('with_output_to(atom(PrologOutput), rule1(1,2))') 运行查询,然后结果将包含一个名为PrologOutput 的Prolog atom(Python 字符串),其中包含输出。
  • 哦,会非常有用的。
猜你喜欢
  • 2019-07-23
  • 2015-02-25
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多