リファレンス no-loop

no-loopは、そのルール自身を回帰的に連続して処理されないようにするときに宣言します。たとえば

package org.drools.test;

import com.sample.Jumper;

rule "ループ"
    when
        jumper : Jumper( )  #エンジンにassertされたファクトの型がJumperの場合、という条件
    then     
        System.out.println("in");
        update( jumper );
end  

このルールをfireすると無限にinを出力し続けます。なぜならupdateしてルールをぬけても、whenの条件が型指定してある以外何も指定してないので再度このルールがmatchしてしまうため。そんな時には「no-loop」です。

package org.drools.test;

import com.sample.Jumper;

rule "ループしないでぇ"
    no-loop true #これだけ!!
    when
        jumper : Jumper( )
    then     
        System.out.println("in");
        update( jumper );
end  

ちなみに指定しない場合はno-loop falseを指定していることと同意だ!注意しなきゃいけんのはそのルール自体が連続して回帰的に、というのがミソだ。この前に書いたjumperのhop-step-jumpする状態遷移で、hop-stepの後にまたhopに状態をupdateするとします。そうするとhop-stepを無限loopします。no-loop trueを入れてもダメです。理由はupdateするとそのルールを抜けて異なるルールがmatchするからです。(hop->step->hop->...という感じ)。無限loopとはいえちょっとしたルールを記述するだけで勝手にloopっちゃうので、ちっちゃな知能を感じます(大袈裟かなw)