首页 > 解决方案 > CLIPS/clipspy 规则顺序

问题描述

所以我正在尝试自学 CLIPS 和 clipspy 以完成课堂作业,但我有点卡住了。下面的代码编译并运行得很好,但输出有点奇怪。我正在尝试扩展我在手册中找到的示例。

import clips
import logging

env = clips.Environment()

logging.basicConfig(level=10, format='%(message)s')
router = clips.LoggingRouter()
router.add_to_environment(env)

env.build("""
(defrule whodunit
  (shoot ?hunter ?who)
  =>
  (printout t ?hunter " shot " ?who crlf)
)""")

env.build("""
(defrule animalGame
  (animal ?ani)
  (shoot $? ?ani)
  =>
  (assert (game ?ani))
)""")

env.build("""
(defrule gameAnimal
  (game ?ani)
  =>
  (assert (animal ?ani))
)""")

env.build("""
(defrule isIllegal
  (shoot ?a ?b)
  (not(game ?b))
  =>
  (assert (criminal ?a))
)""")

env.assert_string("(animal duck)")
env.assert_string("(animal dog)")
env.assert_string("(shoot Brian duck)")
env.assert_string("(shoot Bob rhino)")
env.assert_string("(game deer)")

env.run()

for fact in env.facts():
    print(fact)

这输出:

(initial-fact)
(animal duck)
(animal dog)
(shoot Brian duck)
(shoot Bob rhino)
(game deer)
(animal deer)
(criminal Bob)
(criminal Brian)
(game duck)

尽管他正在射击的动物在下一步被宣布为游戏,但似乎 Brian 被贴上了罪犯的标签,因为他射杀了不是游戏的动物。有没有重新评估规则来解决这个矛盾?

标签: clipsclipspy

解决方案


我想到了。答案是显着性。我还意识到,将所有被猎杀的动物视为游戏并将射击非游戏的动物指控为犯罪存在一些逻辑缺陷/不一致。无论如何:

env.build("""
(defrule animalGame
  (declare (salience 100))
  (animal ?ani)
  (shoot $? ?ani)
  =>
  (assert (game ?ani))
)""")

推荐阅读