Сообщение о выводе JESS

Я пытаюсь сообщить о шагах вывода в JESS. Например, я хотел бы знать, какие правила/факты заставили механизм вывода запустить определенное правило. Другими словами, я хочу увидеть возможности JESS для доказательства теорем. Вот пример из Википедии:

(defrule A ""
   (and (X croaks) (X eats flies))
   =>
   (assert (X is a frog))
)

(defrule B ""
   (and (X chirps) (X sings))
   =>
   (assert (X is a canary))
)

(defrule C ""
   (X is a frog)
   =>
   (assert (X is green))
)

(defrule D ""
   (X is a canary)
   =>
   (assert (X is yellow))
)

Если у меня есть следующее:

(assert (X croaks))

(assert (X eats flies))

Затем, когда я введу (run), я уволю rule C. Похоже, его уволили из-за

(X is a frog)

а на самом деле из-за

(and (X croaks) (X eats flies))

Я не уверен, ясно ли я понимаю, но мне интересно, есть ли способ, которым я могу показать, почему определенные правила запускаются с полным процессом вывода.


person Lorderon    schedule 20.05.2015    source источник
comment
У вас есть это в реальном коде Джесс? Как убедиться, что правило срабатывает?   -  person laune    schedule 20.05.2015
comment
Нет, это не в моем реальном коде. В приведенном выше примере вы можете распечатать факты через (facts) и увидеть, что новые факты добавляются из-за выполнения связанных правил.   -  person Lorderon    schedule 20.05.2015


Ответы (1)


Вам придется написать некоторый код Java, реализующий jess.JessListener. Вы присоединяете объект этого класса к объекту Rete, используя Rete.addJessListener(jess.JessListener). Вас интересует событие JessEvent.DEFRULE_FIRED, и оно будет содержать ссылку на объект активации, из которого доступно правило.

Некоторый код Java см. в Javadoc для JessListener.

Вы можете подключить прослушиватель из кода CLP до (run).

person laune    schedule 20.05.2015
comment
Это был очень полезный ответ, однако он все еще дает мне то, что именно я ищу. Теперь я могу увидеть, какие непосредственные факты действительно вызывают активацию правил. Итак, как я могу знать или действительно могу знать, что такое весь процесс вывода? По сути, мне нужен механизм обратной цепочки для доказательства теоремы. JESS разрешает это? - person Lorderon; 22.05.2015
comment
Ну, если это дает вам именно то, что вы ищете, тогда у вас есть ответ на ваш вопрос. Если это не так, вы задали неправильный вопрос. - person laune; 22.05.2015
comment
Извините, я имел в виду, что это все еще не дает мне то, что я ищу. Итак, мой вопрос в комментарии выше по-прежнему актуален. - person Lorderon; 22.05.2015
comment
Вам нужно написать правила в соответствии с обратной цепочкой Джесс. То, что вы показали, - это прямая цепочка. - person laune; 22.05.2015
comment
Я поработаю над этим и опубликую все выводы здесь. Спасибо за помощь. - person Lorderon; 24.05.2015
comment
@Lorderon - вы также можете получить то, что хотите, для прямой цепочки, просто отслеживая события с течением времени. Используя другие события, вы можете определить, какое правило подтвердило факт в своей правой части, и, таким образом, вы могли бы вести базу данных о том, какие факты активировали, какое правило, какое утверждало, какие факты и т. д. Вся необходимая вам информация доступна с помощью JessListener. - person Ernest Friedman-Hill; 31.05.2015
comment
@ErnestFriedman-Hill -- Да, я нашел JessListener очень полезным. Как вы сказали, я использовал его для отслеживания фактов и правил. Спасибо. - person Lorderon; 02.06.2015
comment
@ErnestFriedman-Hill - у меня есть еще один вопрос. Есть ли способ, которым я могу автоматически сообщать, какие непосредственные факты вызвали срабатывание правила, когда я использую JessListener? Я могу получать события всякий раз, когда они происходят, но это мне не помогает. Потому что один причинный факт может быть добавлен перед многими другими фактами, и я не могу легко сказать, что это было частью шаблона в левой части правила. Или я должен использовать для этого другой интерфейс? - person Lorderon; 05.06.2015
comment
@Lorderon да, объект в событии запуска правила представляет собой запись активации, содержащую фактические объекты фактов. - person Ernest Friedman-Hill; 05.06.2015
comment
@ErnestFriedman-Hill, это здорово. Я нашел, как я могу справиться с этим. Я использовал это ((Activation) jess.getObject()).getToken().toString() в своем JessListener. Большое спасибо. Кстати, я бы хотел, чтобы в вашей книге было несколько примеров о JessListener. - person Lorderon; 06.06.2015