1

Fibanocciの例を取り上げて、少し変更しました。それでも動作するようですが、方法がわかりません。これが私のルールです。

rule "Recurse"
salience 10
    when
       f : Fibanocci(value == 0)
       not Fibanocci(sequence == 0)
    then
       System.out.println(f.sequence + "/" + f.value);
       insert(new Fibanocci(f.sequence - 1));
end

次の出力が得られます。

50/0 49/0 48/0 47/0 46/045/0..など

の新しいインスタンスが挿入されるたびにFibanocci、50から再開する必要があるように見えますが、そうではありません。

// here is my class, getter/setter skipped
public class Fibonacci {

    private int sequence;
    private long value;

    public Fibonacci(final int sequence) {
        this.sequence = sequence;
    }
}
4

1 に答える 1

2

ここに簡単な説明があります。ルールがそのように実行される理由です。

  • すべてのルールは、一致する作業メモリー要素の任意の組み合わせに対して1回だけ実行されます。
  • 最初の一致は、「値==0のフィボナッチオブジェクト」「シーケンス==0のフィボナッチオブジェクトが存在しない」によって生成されます。
  • この組み合わせの場合、ルールは次のようになるまで 再起動しません。
    • 特定のフィボナッチオブジェクトが変更および更新されます。
    • sequence == 0のFibonacci-Objectが表示された後、消えます(*)
  • ルールの結果は、value==0の別のFibonacci-Objectを作成します。これにより、 「value==0のFibonacci-Object」「sequence==0のFibonacci-Objectが存在しない」の一致があと1つだけ作成されます。(「存在しない」という事実は変更されません。)

*)それについて99%しか確信していない

于 2012-07-06T10:46:19.530 に答える