Hello everybody,

I have one "Template" shadow-fact and two "Trigger" shadow-facts. I have a rule ("MAIN::triggers-template") activated by both "Trigger" shadow-facts. This rule is pre-emptive. So once fired by a first "Trigger" fact, it won't be fired by the second one. Each of the "Trigger" shadow-facts have a unique slot named "key".

Generally the output of the Jess program (a simple clp file) looks like this:
------------------------------------------
Jess, the Rule Engine for the Java Platform
Copyright (C) 2006 Sandia Corporation
Jess Version 7.0p1 12/21/2006

[Activation: MAIN::triggers-template  f-3, f-2, ; time=4 ; salience=0]
[Activation: MAIN::triggers-template  f-3, f-1, ; time=4 ; salience=0]
For a total of 2 activations in module MAIN.
f-0   (MAIN::initial-fact)
f-1 (MAIN::Trigger (class <Java-Object:java.lang.Class>) (dynamicSlot 0) (key 1) (priority 0) (template <Java-Object:trigger.Template>) (templateKey 1) (OBJECT <Java-Object:trigger.Trigger>)) f-2 (MAIN::Trigger (class <Java-Object:java.lang.Class>) (dynamicSlot 0) (key 2) (priority 0) (template <Java-Object:trigger.Template>) (templateKey 1) (OBJECT <Java-Object:trigger.Trigger>)) f-3 (MAIN::Template (class <Java-Object:java.lang.Class>) (key 1) (state 0) (OBJECT <Java-Object:trigger.Template>))
For a total of 4 facts in module MAIN.
******* Trigger [key 2] (Fact Id 2) triggers template [key 1]
------------------------------------------
However, sometimes the shadow-facts doesn't have the same order in the working memory. It is really strange, because I am using the same clp file. So the shadow-facts are added in the same order. As you can see below, instead to be fired by the [key 2] shadow-facts (Fact Id 2), the rule is fired by [key 1] shadow-facts (Fact Id 3). See the last line of the output with "*******".
------------------------------------------
Jess, the Rule Engine for the Java Platform
Copyright (C) 2006 Sandia Corporation
Jess Version 7.0p1 12/21/2006

[Activation: MAIN::triggers-template  f-1, f-3, ; time=4 ; salience=0]
[Activation: MAIN::triggers-template  f-1, f-2, ; time=4 ; salience=0]
For a total of 2 activations in module MAIN.
f-0   (MAIN::initial-fact)
f-1 (MAIN::Template (class <Java-Object:java.lang.Class>) (key 1) (state 0) (OBJECT <Java-Object:trigger.Template>)) f-2 (MAIN::Trigger (class <Java-Object:java.lang.Class>) (dynamicSlot 0) (key 2) (priority 0) (template <Java-Object:trigger.Template>) (templateKey 1) (OBJECT <Java-Object:trigger.Trigger>)) f-3 (MAIN::Trigger (class <Java-Object:java.lang.Class>) (dynamicSlot 0) (key 1) (priority 0) (template <Java-Object:trigger.Template>) (templateKey 1) (OBJECT <Java-Object:trigger.Trigger>))
For a total of 4 facts in module MAIN.
******* Trigger [key 1] (Fact Id 3) triggers template [key 1]
------------------------------------------
This strange behavior seems to occur randomly. Sometimes it happens only after many attempts. In the beginning, I thought that it was caused by a rule ("INIT::modify-trigger-1") that modified a "Template" shadow-facts. This rule was called before the pre-emptive rule ("MAIN::triggers-template"). But I commented the "modify-trigger-1" rule and its module (INIT) and the problem occurs still. Here is the source code:
------------------------------------------
(import trigger.Template)
(import trigger.Trigger)

(deftemplate MAIN::Trigger
   (declare (slot-specific TRUE) (from-class trigger.Trigger)))
(deftemplate MAIN::Template
   (declare (slot-specific TRUE) (from-class trigger.Template)))

(defglobal ?*idle* = 0)
(defglobal ?*triggered* = 1)

; Constructor : Template(int aKey, int aState)
(bind ?template (new trigger.Template 1 ?*idle*))
(add ?template)

; Constructor : Trigger(int aKey, int aPriority, int aTemplateKey, int aDynamicSlot, Template aTemplate)
(bind ?trigger1 (new trigger.Trigger 1 0 (?template getKey) 0 ?template))
(add ?trigger1)
(bind ?trigger2 (new trigger.Trigger 2 0 (?template getKey) 0 ?template))
(add ?trigger2)
;(bind ?trigger3 (new trigger.Trigger 3 1 (?template getKey) 0 ?template))
;(add ?trigger3)

(reset)

;(defmodule INIT)
;
;(defrule INIT::modify-trigger-1
;     ?triggerFact <-
;         (MAIN::Trigger
;         (key 1)
;         )
; =>
;     (printout t "******* Facts before modification." crlf)
;     (facts)
;     (modify ?triggerFact (dynamicSlot 1))
;     (printout t "******* Facts after modification." crlf)
;     (facts)
; (printout t "******* Trigger [key 1] dynamicSlot has been modified." crlf)
;     )

(defrule MAIN::triggers-template
   ?templateFact <-
   (MAIN::Template
       (key ?templateKey)
       (state ?*idle*)
       (OBJECT ?template))
   ?triggerFact <-
       (MAIN::Trigger
       (key ?key)
       (priority ?p1)
       (template ?template))
   (not
       (MAIN::Trigger
           (priority ?p2&:(< ?p2 ?p1))
           (template ?template)))
   =>
   (facts)
(printout t "******* Trigger [key " ?key "] (Fact Id " (?triggerFact getFactId) ") triggers "
   "template [key " ?templateKey "]" crlf)
   (modify ?templateFact (state ?*triggered*))
   )

;(focus INIT)

(agenda)
(run)
------------------------------------------
I would be glad, if anybody could help me to figure out something.

Thanks in advance,

NicolasF
--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
--------------------------------------------------------------------

Reply via email to