特定の条件が満たされたときに何千もの事実を撤回するルールがあります。このルールは、「not」ステートメントを使用する他の 2 つのルールを含むモジュール内にあります。私の質問は次のとおりです。
- 最初のルールがファクトを撤回するたびに、rete ネットワークが再計算されますか?
- それは、他の 2 つのルールの「not」ステートメントが原因でしょうか?
- 最初のルールで撤回するファクトがなくなるまで、アクティベーションの再計算を停止する方法はありますか?
ありがとう!
撤回された事実の型を使用するルールのパターンを知らなければ、正確な答えはできません。
明らかに、 ifFactがそのタイプで、ルール #2 と #3 には
not Fact(...constraints...)
これらの Fact ファクトの最後のもの (制約を満たすものがある場合) がワーキング メモリから削除されるまでは、大きなことは何も起こらないはずです。その後、追加のノードを作成する必要がある場合があります (CE 以外のものによって異なります)。これは、not CE の後にあるものに応じて継続し、最終ノード、つまりアクティベーションにつながる可能性があります。
みたいなパターンなら
Fact(...constraints...)
これらのルールのいずれかに含まれている場合、Fact (これらの制約を満たすものがある場合) を撤回すると、ネットワーク内の保留中のアクティブ化とノードの削除に対するアクションが即座に発生します (以前に含まれていた場合)。
Rete ネットワークでの出来事を回避するためにできることはあまりありません。
とはいえ、何千もの事実を撤回しなければならないというのは、かなり恐ろしいことです。何人残っていますか?少数を選択して、まったく新しい Rete で最初からやり直す方が安上がりかもしれません。または、これらの数千のすべてを一度にエンジンに公開しない設計パターンを使用します。または、他の何か。
ルールが実行される可能性があるまで、部分的な一致とアクティベーションの再生成を回避する遅延アルゴリズムを作成しました。怠け者なので、salience を使用してルールの評価を遅らせることができます。 http://blog.athico.com/2013/11/rip-rete-time-to-get-phreaky.html