clips - 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 被贴上了罪犯的标签,因为他射杀了不是游戏的动物。有没有重新评估规则来解决这个矛盾?
解决方案
我想到了。答案是显着性。我还意识到,将所有被猎杀的动物视为游戏并将射击非游戏的动物指控为犯罪存在一些逻辑缺陷/不一致。无论如何:
env.build("""
(defrule animalGame
(declare (salience 100))
(animal ?ani)
(shoot $? ?ani)
=>
(assert (game ?ani))
)""")
推荐阅读
- sql - 有没有办法按年拆分 sql 结果?
- caching - PageSpeedInsights - 静态资产缓存对分数和 SEO 的影响
- c# - 在 c# 中的 HTML 字符串中搜索纯文本字符串的最佳方法?
- react-native - 排毒测试作为应用程序加载 TypeError:null 不是对象“评估 RNGestureHandler.default.Direction”
- java - 使用回溯的背包
- java - 使用 cron 作业从特定 jar 运行 java 类
- c - C 用户定义函数问题
- java - IDEA Ultimate 2019.3 上的 org.springframework.boot.web.embedded.tomcat.ConnectorStartFailedException
- docker - 在 docker 上部署 Redis 以进行生产的最佳选择是什么?
- javascript - Testcafe:.includes() 在 if/else 语句中使用时不是函数