有没有办法在 python(python 桥接序言)中打印它?
Is there any way to print it in python(python bridging on prolog)?
我正在尝试使用 pyswip 运行 来自 python 程序的序言查询。
假设我有这样的程序,
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)')))
现在我想要的是所有将在序言中打印的 writeln 规则,我希望将其打印在 python terminal.is 中,有什么方法可以做到吗?
对我来说,它的行为如下:
>>> print(list(p.query('rule1(1,2)')))
in rule2:1
rule2 exectued
in rule3:2
[{}]
您的 writeln
语句按预期执行,输出打印到 Python 终端。你的输出不同吗?你想让它与众不同吗?
编辑(见下面的评论): 当 Python 不是 运行 直接在终端中而是在 Jupyter notebook 或类似工具中时,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'}]
我正在尝试使用 pyswip 运行 来自 python 程序的序言查询。 假设我有这样的程序,
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)')))
现在我想要的是所有将在序言中打印的 writeln 规则,我希望将其打印在 python terminal.is 中,有什么方法可以做到吗?
对我来说,它的行为如下:
>>> print(list(p.query('rule1(1,2)')))
in rule2:1
rule2 exectued
in rule3:2
[{}]
您的 writeln
语句按预期执行,输出打印到 Python 终端。你的输出不同吗?你想让它与众不同吗?
编辑(见下面的评论): 当 Python 不是 运行 直接在终端中而是在 Jupyter notebook 或类似工具中时,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'}]