リファレンス exists

これはワーキングメモリに存在しているか、ということなんだけど正確には「ひとつでもあるか」となります。まずは豚もおだてりゃ木に登るのシンプルな例。

rule "climbtree"
    when
     $person : Person(action == 'おだてる')
        exists Tree() 
     $pig : Pig()
    then
        $pig.climb();
end  

となります。

exists Tree()は今までやってきたようにTree()の単純に記述するのと何が違うのかというと「ひとつでもあるか」ってところです。下のJavaの例だと

public class Pig {
/** 登る */
    public void climb() {
      System.out.println("登ったどー");
    }
}

StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
Tree tree = new Tree(5);
ksession.insert(tree);
Tree tree2 = new Tree(10);
ksession.insert(tree2);
ksession.fireAllRules();

として実行したとします。木(Tree)を2本置きました。existsを用いるとマッチングは1回、Tree()だけだと2回マッチングします。これはつまり、ワーキングメモリ上ではオブジェクトはIdentityで認識しているということです。これはデフォルトの挙動です、中身としてはIdentityHashMapに保存されます。weakReferenceじゃないんだね、そっか〜。。。ちなみに、この挙動はEqualityに変えられる。昔のAPIではマニュアルにかいてあったんだけど5.0用が見当たらない。sourceみた限りも見つからんかった。昔のままなのか。あとで調べる。
<追記>

KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();

と宣言して

config.setOption( AssertBehaviorOption.EQUALITY );

config.setProperty( AssertBehaviorOption.PROPERTY_NAME, "equality" );

でおk!!でした。