For the case when r2 has the 'not'. When 4 doesn't exist r3 is true, when r3 fires it asserts 4, thus r3 can no longer be true, however r4 retracts the 4 and 2  still exists, thus enabling r3 to match again which causes the recursion - basically the insertion and retracting of 4 is toggling r3 on and off. Best thing to do is always use the audit log so you can visualise what's going on.

Mark
lukichev wrote:

Dear Mark,

 

I have a question concerning rule execution algorithm in JBoss 4.0.1.

 

There are 2 rule sets, one runs in a circle and another one stops.

 

The first one, which stops:

 

rule "r1"

      when

            $num1:Integer(intValue == 1)

      then

            insert(new Integer(2));

end

 

rule "r2"

      when

            $num1:Integer(intValue == 2)

      then

            insert(new Integer(3));

end

 

rule "r3"

      when

            $num1:Integer(intValue == 2)

      then

          insert(new Integer(4));

end

 

rule "r4"

      when

            $num1:Integer(intValue == 3)

            $num2:Integer(intValue == 4)

      then

            retract($num2);

end

 

The second one, which runs in a circle, is different from the one above by the additional condition in r3:

 

            not $num2:Integer(intValue == 4)

 

I would expect the same behavior of these two rule sets, but it is different. Could you, please, comment, why this is so?

 

Sincerely,

Sergey Lukichev

Research Assistant, REWERSE I1, rule modeling and markup