Для простоты предположим, что у меня есть следующие два шаблона:
(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>)
, но на самом деле это вызывает исключение, если факт больше не находится в памяти. Вдобавок к этому это медленная функция , которой я бы хотел избежать. 1012 и если я обнаруживаю исключение JessException, я знаю, что его больше нет в памяти, поэтому я могу удалить его из списка.
Есть ли более элегантный способ сделать это?