gpt4 book ai didi

java - Jess - 有没有一种有效的方法来检查事实是否仍在工作内存中?

转载 作者:行者123 更新时间:2023-12-01 16:13:14 24 4
gpt4 key购买 nike

为简单起见,假设我有以下两个模板:

(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 相关的事实也将被收回,但事实和 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 列表最新要好得多。

关于java - Jess - 有没有一种有效的方法来检查事实是否仍在工作内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62477682/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com