我对规则引擎Jess有很大的麻烦。我所面临的问题是条件元素的积累。我试图写一条规则,根据一些标准,从我的工作记忆中给出一个单词列表,但它向我展示了列表的所有阶段--首先是一个空列表,然后是一个包含一个元素的列表,然后它继续这样做--它通过一次又一次地触发同样的规则来做到这一点。但我知道,并确信,工作记忆不会改变,而这一规则触发。
同样奇怪的是,我在几个小时前写了同样的规则,结果,它只给出了一个包含多个元素的列表。
你对我做错了什么有什么建议吗?
请帮帮我!以下是代码:
(defrule show-me
(declare (salience -11)
(no-loop TRUE))
?my-list <- (accumulate (bind ?list (new java.util.ArrayList)) ;initializer
(?list add ?sWord) ; action
?list ;result
(ourObject (sourceWord ?sWord) ; CE
{complementType == COMPLEMENTO-OGGETTO-PARTITIVO}))
=>
(printout t "complementType" (?my-list toString) crlf))这就是我得到的结果:
complementType[ un , po , di , acqua , tua ]
complementType[ un , po , acqua , tua ]
complementType[ un , acqua , tua ]
complementType[ acqua , tua ]
complementType[ acqua ]
complementType[]我只需要这个:
complementType[ un , po , di , acqua , tua ]附注:对不起,代码的外观,但它不允许我粘贴它的现状。
发布于 2014-08-27 18:31:49
很可能是在引擎运行时插入ourObject事实。一种方法是在一个线程中调用run (其中块),然后在另一个线程中插入事实。这将立即创建激活,然后按反向顺序执行,因为冲突解决方案更喜欢更新的激活而不是旧的激活。
如果您执行这两个插入变体中的任何一个。该规则如预期的那样,只触发一次。
;;(deffacts facts
;; (ourObject (sourceWord un)(type X))
;; (ourObject (sourceWord po)(type X))
;; (ourObject (sourceWord di)(type X))
;; (ourObject (sourceWord acqua)(type X)))
(reset)
(assert (ourObject (sourceWord un)(type X)))
(assert (ourObject (sourceWord po)(type X)))
(assert (ourObject (sourceWord di)(type X)))
(assert (ourObject (sourceWord acqua)(type X)))
(run)https://stackoverflow.com/questions/25531616
复制相似问题