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