我遇到了规则引擎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 ]
P.S。很抱歉代码外观,但它不允许我按原样粘贴它。
答案 0 :(得分:0)
最有可能的是,您在引擎运行时插入了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)