Джесс - Есть ли эффективный способ проверить, сохраняется ли факт в рабочей памяти? - PullRequest
0 голосов
/ 19 июня 2020

Для простоты предположим, что у меня есть следующие два шаблона:

(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, я знаю, что его больше нет в памяти, поэтому я могу удалить его из списка.

Есть ли более элегантный способ сделать это?

1 Ответ

0 голосов
/ 20 июня 2020

Если вам нужно выполнить действие, когда выполняется какое-то условие, лучше всего написать правило, соответствующее этому условию. Если у вас есть A, но нет B, правило должно: (a1) создать B, (a2) вставить B в список <>. Если у вас есть B, но нет A, другое правило должно: (b1) отозвать B, (b2) удалить B из списка <>. Поскольку ваше правило «один к одному» не разрешает кодирование (b2), вы не можете использовать «логический» CE.

Поддерживать актуальность списка Java - это очень предпочтительнее по сравнению с решением, использующим два правила.

...