Jess Accumulate

时间:2014-08-27 15:48:46

标签: arraylist jess accumulate

我遇到了规则引擎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。很抱歉代码外观,但它不允许我按原样粘贴它。

1 个答案:

答案 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)