Hi,

I've noticed some "interesting" behaviour with the use of no-loop and salience that I wonder if anybody can explain to me?

Given the following rules:-

package drools.debug

rule "Rule 1- (Fired)"
//salience 500
no-loop true
when
        $m : Machine ( )
then
        System.out.println("DEBUG [Rule 1-]---> Do nothing!");
end

rule "Rule 1a (Fired)"
//salience 400
no-loop true
when
        $m : Machine ( )
then
        System.out.println("DEBUG [Rule 1a]---> Setting Attribute(\"TEST3\") on Machine");
        Attribute a = new Attribute("TEST1", 100);
        $m.setAttribute(a);
        modify($m);
        assert(a);
end

rule "Rule 1b (Fired)"
//salience 300
no-loop true
when
        $a : Attribute( name == "TEST1" )
        $m : Machine ( attribute == $a )
then
        System.out.println("DEBUG [Rule 1b]---> Found!");
end

Assuming only one Machine Fact is present in Working Memory and the salience lines above are commented out "Rule 1- (Fired)", "Rule 1a (Fired)" and "Rule 1b (Fired)" are activated and fired once (and once only). If however the salience values are uncommented rule "Rule 1- (Fired)" is fired twice (even though it is has the "no-loop" attribute). If the salience statements remain but have the same value then the rules only fire once as well (as I'd expect). It appears that "no-loop" only applies to rules with the same salience. Is this correct? Can somebody provide some reason as to why this occurs as it is different to what I'd expect?

With kind regards,

Mike