首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Python与Clips规则引擎通信

用Python与Clips规则引擎通信
EN

Stack Overflow用户
提问于 2020-09-21 14:13:40
回答 1查看 781关注 0票数 0

我想用Python3.8.3中的Clips规则引擎进行多次通信。

例如,我希望有以下的通信

  1. 发射剪辑

代码语言:javascript
复制
    C:\Users\username\Clips>"C:\Program Files\CLIPS 6.31\CLIPSDOS64.exe"
             CLIPS (6.31 6/12/19)

  1. 定义规则

代码语言:javascript
复制
    (defrule ValueManipulation
      (value ?v)
    =>
      (assert (result ?v))
    )

具有第一个事实集的

  1. 查询和从stdout

读取结果

代码语言:javascript
复制
    (deffacts f1 "My facts" (value 1))
    (reset)
    (run)
    (facts)

带有第二个事实集的

  1. 查询和从stdout

读取结果

代码语言:javascript
复制
    (deffacts f1 "My facts" (value 2))
    (reset)
    (run)
    (facts)

  1. Exit

代码语言:javascript
复制
    (exit)

我只输入了一次stdin,读了一次stdout的内容:

代码语言:javascript
复制
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读取输出

代码语言:javascript
复制
    (deffacts f1 "My facts" (value 3))
    (reset)
    (run)
    (facts)

在上面的示例中,不喜欢使用像pyclipsclipspy这样的包,因为这些包在pip install中是不可用的。然而,重新打包其中一个包可以解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2020-09-22 05:56:42

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

下面是演示重用clips规则的测试代码:

代码语言:javascript
复制
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)

上述代码产生以下结果:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63994081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档