正向链LIFO策略下r2始终先于r5触发的原因问询
CLIPS中r2始终先于r5触发的原因解析
背景说明
Forward chaining(LIFO)深度策略的核心规则:
- 新激活的规则会被置于所有相同salience值的规则之上
- 由同一事实激活的规则,理论上相互位置随机
给定的CLIPS事实与规则
(deffacts my_facts (B) (C)) (defrule r1 (B)(D)(E)=>(assert (F))) (defrule r2 (C)(D) => (assert (A))) (defrule r3 (C)(F)=>(assert (A))) (defrule r4 (B) => (assert (X))) (defrule r5 (D) => (assert (D))) (defrule r6 (X)(A) => (assert(H)) (printout t 'H' is reached crlf) (halt)) (defrule r7 (C) => (assert (D))) (defrule r8 (X) (C) => (assert (A))) (defrule r9 (X) (B) => (assert (D)))
执行命令
(reset) (watch all) (run)
问题
测试发现r2始终先于r5触发,但按策略二者位置应随机,请问该现象的原因是什么?
原因分析
CLIPS的官方实现中,对于同salience值的规则,当它们由同一事实(或同一组事实变化)激活时,议程中的排序并非真正随机,而是默认遵循规则的定义顺序。你提到的“由同一事实激活的规则相互位置随机”属于理论层面的策略描述,但CLIPS实际并未实现随机化逻辑,而是以规则编写的先后顺序作为议程排序的依据。
由于r2在代码中早于r5定义,因此每次(D)事实被断言激活这两个规则时,r2都会被排在议程中r5的前面,最终导致r2始终先于r5触发。
内容的提问来源于stack exchange,提问作者YAMI
相关产品推荐
相关产品推荐

