Для простоты предположим, что у меня есть следующие два шаблона:
(deftemplate JessObjA (declare (from-class JessObjA)) )
(deftemplate JessObjB (declare (from-class JessObjB)) )
и правило, которое добавляет JessObjB в память всякий раз, когда происходит совпадение с JessObjA. В дополнение к этому у меня есть объект, подобный списку, в моей программе Java, в котором хранятся эти JessObjB (либо идентификатор факта, либо ссылка. Я не определился с этим, так как не знаю, что лучше на данный момент):
(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>)
, но на самом деле это вызывает исключение, если факта больше нет в памяти. Кроме того, это медленная функция , чего я хотел бы избежать.
Мое единственное работающее решение до сих пор уродливо: мой список содержит JessObjB
объектов, и чтобы проверить, существует ли он как факт или нет, я вызываю Rete.getShadowFactForObject на нем, и если я сталкиваюсь с JessException, то я знаю, что его больше нет в памяти, так что я могу удалить его из списка.
Есть ли более элегантный способ сделать это?