为简单起见,假设我有以下两个模板:(deftemplate JessObjA (declare (from-class JessObjA)) )(deftemplate JessObjB (declare (from-class JessObjB)) )以及每当发生JessObjA匹配时将JessObjB添加到内存中的规则。除此之外,我的Java程序中还有一个类似列表的对象,用于存储这些JessObjB(事实ID或引用。我对此尚不确定,因为我目前尚不知道哪个更好):(defrule one-for-one(logical ?x <- (JessObjA))=> (bind ?p (new JessObjB )) (printout t "made a new JessObjB" ?p crlf) (add ?p) (bind ?list (fetch someList)) (?list add ?p))我想保持someList的内容为最新。我知道,如果我撤回JessObjA,与JessObjB相关的事实也将撤回,但Fact和JessObjB对象仍然保留在Java的内存中(如果我的列表中包含引用)。我要做的是定期检查列表中是否有任何值引用了不再存在于内存中的事实标识符。我的第一个想法是使用(fact-id <id>),但是如果事实不再存在于内存中,则实际上会引发异常。最重要的是,我要避免使用it is a slow function。到目前为止,我唯一可行的解​​决方案是丑陋的:我的列表包含JessObjB对象,并检查它是否作为事实存在,我在其上调用Rete.getShadowFactForObject,如果遇到JessException,则知道它是不再在内存中,因此我可以将其从列表中删除。有没有更优雅的方法可以做到这一点? 最佳答案 如果需要在满足某些条件时执行操作,最好编写一条规则以匹配条件。如果您有A但没有B,则规则必须:(a1)创建B,(a2)将B插入List 。如果您有B但没有A,则必须遵循另一条规则:(b1)收回B,(b2)从List 中删除B。由于您的规则“一对一”不允许对(b2)进行编码,因此您不能真正使用“逻辑” CE。与使用两个规则的解决方案相比,保持Java列表最新是非常可取的。
10-02 04:56