0

これは私の以前の質問に関連しています。がない場合insert、期待どおりに再帰ループに入ります。しかし、私が持っている場合insert、プログラムは終了します。ここで何が欠けていますか?

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

1 に答える 1

3

この例を説明するために、次のように仮定します。

  • システムのルールは 1 つだけです
  • ルール エンジンに提供された最初のファクト セットがそのルールの when の基準を満たすこと
  • そのシーケンスは正の整数値です

まず、挿入がコメントアウトされている場合を考えます。

ワーキング メモリには、値 == 0 を持つオブジェクトが少なくとも 1 つ含まれており、シーケンス == 0 を持つオブジェクトは存在しないことがわかっています。 .) ( 存在するフィボナッチ (...))) ではありません。両方の基準を満たす単一のオブジェクトが存在する場合、ルールは有効であることに注意してください。

その結果、オブジェクトの値がゼロに設定され、このオブジェクトが変更されたことをエンジンに通知します。システム内に sequence == 0 のオブジェクトがなく、このオブジェクトがルールの実行をトリガーするように値を設定したため、無限ループが発生します。

ここで、挿入がコメント解除されている場合を考えてみましょう。

最初のファクト セットがルールを少なくとも 1 回実行することは既にわかっています。その結果、デクリメントされたシーケンスを持つオブジェクトが作業メモリに配置され、 f によって参照されるオブジェクトの値がゼロに設定され (ゼロから変更されない)、更新されます。ある時点でゼロシーケンスを持つオブジェクトが挿入されるため、終了条件が満たされるメカニズムが整っています。これで終了条件を満たします。

つまり、シーケンス 0 を持つフィボナッチ オブジェクトがある場合、エンジンは終了します。

私は、エラー..、フィボナッチ数列を出力する前に、このシステムを少し変更する必要があると思います。設定されているフィボナッチ数を評価するには、前の 2 つのフィボナッチ数を参照する方法が必要です。再帰的な方法ははるかにエレガントです ;)

于 2012-07-13T22:45:46.967 に答える