与Python中的Clips规则引擎进行通信

问题描述

我想与Python 3.8.3中的Clips规则引擎进行多次交流。

例如,我想进行以下交流

  1. 启动剪辑
    C:\Users\username\Clips>"C:\Program Files\CLIPS 6.31\CLIPSDOS64.exe"
             CLIPS (6.31 6/12/19)
  1. 定义规则
    (defrule ValueManipulation
      (value ?v)
    =>
      (assert (result ?v))
    )
  1. 使用第一个事实集进行查询并从stdout读取结果
    (deffacts f1 "My facts" (value 1))
    (reset)
    (run)
    (facts)
  1. 使用第二个事实集进行查询并从stdout读取结果
    (deffacts f1 "My facts" (value 2))
    (reset)
    (run)
    (facts)
  1. 退出
    (exit)

我设法一次输入到stdin并从stdout中读取一次:

import subprocess

clips_commands = """
(defrule ValueManipulation
  (value ?v)
=>
  (assert (result ?v))
)
(deffacts f1 "My facts" (value 1))
(reset)
(run)
(facts)
(exit)
"""
p = subprocess.Popen('"C:\Program Files\CLIPS 6.31\CLIPSDOS64.exe"',stdin=subprocess.PIPE,stdout=subprocess.PIPE)
result = p.communicate(input=bytes(clips_commands,'utf-8'))

for line in str(result[0]).split('\\r\\n'):
    print(line)

但是,我想多次进行以下类型的查询并读取stdout的输出

    (deffacts f1 "My facts" (value 3))
    (reset)
    (run)
    (facts)

在上面的示例中,不建议使用pyclipsclipspy之类的软件包,因为这些软件包不适用于pip install。但是,重新包装其中一个软件包可以解决这个问题。

解决方法

多亏@noxdafox,我才能够使用clipspy库!

下面是演示重复使用剪辑规则的测试代码:

import clips

env = clips.Environment()

rule = """
(defrule ValueManipulation
  (value ?v)
=>
  (assert (result ?v))
)
"""
env.build(rule)

print('Add fact 1:')
env.assert_string("(value 1)")
for fact in env.facts():
    print(fact)
env.run()
print('\nResult for fact 1:')
for fact in env.facts():
    print(fact)

print('\nFacts after reset:')
env.reset()
for fact in env.facts():
    print(fact)
env.assert_string("(value 2)")

print('\nResult for fact 2:')
env.run()
for fact in env.facts():
    print(fact)

print('\nResult for fact 3:')
env.reset()
env.assert_string("(value 3)")
env.run()
for fact in env.facts():
    print(fact)

上面的代码产生以下结果:

Add fact 1:
(initial-fact)
(value 1)

Result for fact 1:
(initial-fact)
(value 1)
(result 1)

Facts after reset:
(initial-fact)

Result for fact 2:
(initial-fact)
(value 2)
(result 2)

Result for fact 3:
(initial-fact)
(value 3)
(result 3)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...