首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >杰斯积累

杰斯积累
EN

Stack Overflow用户
提问于 2014-08-27 15:48:45
回答 1查看 232关注 0票数 0

我对规则引擎Jess有很大的麻烦。我所面临的问题是条件元素的积累。我试图写一条规则,根据一些标准,从我的工作记忆中给出一个单词列表,但它向我展示了列表的所有阶段--首先是一个空列表,然后是一个包含一个元素的列表,然后它继续这样做--它通过一次又一次地触发同样的规则来做到这一点。但我知道,并确信,工作记忆不会改变,而这一规则触发。

同样奇怪的是,我在几个小时前写了同样的规则,结果,它只给出了一个包含多个元素的列表。

你对我做错了什么有什么建议吗?

请帮帮我!以下是代码:

代码语言:javascript
复制
(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))

这就是我得到的结果:

代码语言:javascript
复制
complementType[ un  ,  po  ,  di  ,  acqua  ,  tua  ]
complementType[ un  ,  po  ,  acqua  ,  tua  ]
complementType[ un  ,  acqua  ,  tua  ]
complementType[ acqua  ,  tua  ]
complementType[ acqua  ]
complementType[]

我只需要这个:

代码语言:javascript
复制
complementType[ un  ,  po  ,  di  ,  acqua  ,  tua  ]

附注:对不起,代码的外观,但它不允许我粘贴它的现状。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-27 18:31:49

很可能是在引擎运行时插入ourObject事实。一种方法是在一个线程中调用run (其中块),然后在另一个线程中插入事实。这将立即创建激活,然后按反向顺序执行,因为冲突解决方案更喜欢更新的激活而不是旧的激活。

如果您执行这两个插入变体中的任何一个。该规则如预期的那样,只触发一次。

代码语言:javascript
复制
;;(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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25531616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档