0

我在使用规则引擎 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  ]

ps 很抱歉代码出现,但它不允许我按原样粘贴它。

4

1 回答 1

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)
于 2014-08-27T18:31:49.733 回答