RetePlus アルゴリズム
RetePlus これはReteアルゴリズムに基づく拡張 Decision Server です。 RetePlus モードでは、ルール実行は、作業メモリーとアジェンダに基づいて環境を使用します。
作業メモリーとアジェンダ
実行 RetePlus モードでは、ルールエンジンはワーキングメモリとアジェンダを用いて機能し、条件が満たされた際に実行用のルールインスタンスを追加する。
作業記憶
実行 RetePlus モードでは、ルールエンジ Decision Server ンはワーキングメモリとペアになる。 作業メモリーには、関連する Engine オブジェクトに含まれているすべてのオブジェクトが含まれます。 作業メモリーを変更するには、ルールのアクション部分にステートメントを追加するか、またはアプリケーション・プログラミング・インターフェース (API) を使用します。 したがって、ルール・エンジンは、作業メモリー内に存在するオブジェクトとそれらのオブジェクトにリンクされているオブジェクトを認識します。 ルール・エンジンが使用できるオブジェクトは、作業メモリーからアクセス可能なオブジェクトのみです。
スケジュール
アジェンダは、そのパターンがすべて一致したルールを格納する Decision Server 場所である。 アジェンダに追加されるルールはインスタンス化されると言われ、 ルールインスタンスとなる。 詳細は「ルールインスタンス」 を参照のこと。
アジェンダには、 rundとして適格なルール・インスタンスが保管されます。 アジェンダが空の場合、実行は無効です。 アジェンダに置かれたルールは、実行可能と見なされます。 通常、アジェンダ内には、実行可能なルールが複数あります。 結果として、ルール・エンジンは、アジェンダ内のどの特定のルールを実行すべきかを決定する何らかの方法を持つ必要があります。
アジェンダ内では、ルール・インスタンスは、最初に実行する必要があるルールを決定する 3 つの基準に従って順序付けられます。 より複雑な機能の実装により、追加の実行制御が提供されます。 オブジェクト通知を参照してください。
- 屈折
新規ファクトが発生しなかった場合、つまり、ルールに一致するオブジェクトが何も変更されていない場合、またはルールによって一致する新規オブジェクトがない場合は、実行されたルール・インスタンスをアジェンダに再挿入することはできません。
屈折方針では、所定のタプルに対して作成されるルール・インスタンスが 1 つのみになります。 エンジンのサイクルにおけるデータ単位はワーキングメモリであるため、エンジンはすべての可能なタプルを容易に記録し、各タプルに対してルールインスタンスが唯一であることを確認できる。
例えば、次のようなルール・セットがあるとします。
class Person { Person(int age, boolean sick); boolean sick; int age; } rule incrementAge { when { p: Person(!sick; age < 50); } then { p.age += 1; update p; } rule cure { when { p: Person(sick); } then { p.sick = false; update p; }オブジェクト
Person(18,true)が作業メモリーに挿入された場合、屈折方針により、以下の実行トレースが生成されます。cureincrementAge
以下のように、
incrementAgeルールで反復可能プロパティーを追加できます。rule incrementAge { property com.ibm.rules.engine.repeatable=true; when { p: Person(!sick; age < 50); } then { p.age += 1; }オブジェクト
Person(18,true)が作業メモリーに挿入された場合、反復可能プロパティーにより、以下の実行トレースが生成されます。cureincrementAgeincrementAgeincrementAge...incrementAge条件
age < 50が falseになるまで。
- 反復可能ルール
- 屈折方針を中断するために、ブール型のルール・プロパティー com.ibm.rules.engine.repeatable を使用できます。 意思決定エンジンでは、反復可能にする一連のルールをマークするために、このプロパティーを使用する必要があります。
- ルールが反復可能でない場合は、屈折方針によって、ルール・インスタンスがアジェンダに再度送られることが防止されます。
- ルールが反復可能であるときは、条件オブジェクトに対して変更が発生した場合に、ルールをルール・インスタンスとしてアジェンダに再度挿入できます。
- リーセンシ
2 つのルール・インスタンスが同じ優先順位を持つ場合、最新のオブジェクト ( 最後に挿入されたオブジェクト、変更されたオブジェクト、またはリトラクトされたオブジェクト ) に一致するルールが最初に実行されます。
複数のルール・インスタンスが同時に実行候補となった場合は、優先度とリーセンシーを使用して競合が解決されます。 指定された競合解決方法をすべて使用した後も、複数のルール・インスタンスが候補として残っている場合、エンジンは内部のメタルールを使用します。これで、条件が同じであれば、常に同じルール実行順序に従うようになります。
ルール実行順序の例
以下のテクニカル・ルールの例では、ルールが実行される順序を示します。
rule init {
when {
angel();
}
then {
insert clown();
insert dascyllus();
}
};
rule last {
priority = -100;
when {
dascyllus();
}
then {
System.out.println("last");
}
};
rule first {
priority = 100;
when {
angel();
clown();
dascyllus();
}
then {
System.out.println("first");
}
};
rule second {
priority = 0;
when {
angel();
dascyllus();
clown();
}
then {
System.out.println("second");
}
};
rule third {
priority = 0;
when {
angel();
clown();
dascyllus();
}
then {
System.out.println("third");
}
};
オブジェクト angel が APIを使用してアプリケーションから挿入されたため、作業メモリーに挿入されているため、実行可能なすべてのルールを実行するとします。
ルールを実行する順序を以下に示します。
initルール: オブジェクトがangelアプリケーションから挿入されたため、このinitルールが実行可能な唯一のルールです。 このルールはオブジェクトclownに続いてオブジェクトdascyllusを作業メモリーに挿入します。 したがって、最新のオブジェクトはdascyllusです。firstルール: このルールは、secondルールの前に実行されます。 この 2 つのルールに一致する最新のオブジェクトは同じです。 ただし、最初のオブジェクトは 2 番目のオブジェクトよりも優先度が高く、これで実行順序が決まります。secondルール: このルールは、thirdルールの前に実行されます。 second ルールと third ルールの優先度は同じですが、オブジェクトdascyllusはオブジェクトclownよりも最近のオブジェクトです。thirdルール: このルールは、lastルールの前に実行されます。 オブジェクトdascyllusはclownよりも最近のオブジェクトですが、thirdルールはlastルールよりも高い優先度を持っています。lastルール。
ルール・インスタンス
ルール・インスタンス がアジェンダに追加されるのは、作業メモリー内のオブジェクトがそのルールの条件部分を満たしているときです。
次のテクニカル・ルールがあるとします。
rule rule1 {
when {
Fish(color == green; type == shark);
Fish(type == trigger);
}
then {...}
};
次のルール・インスタンスがアジェンダに挿入されます。
| ルール | ルール | ルール | ルール |
|---|---|---|---|
| rule1(A,C®) | rule1(A,D) | rule1(B,C) | rule1(B,D) |
この例で、ルール・インスタンスは動的な概念であることが分かります。ルール・インスタンスは、ルールに指定されたパターンと一致する作業メモリー内のオブジェクトの組み合わせによって生成されます。 対照的に、ルールは静的な概念です。
否定パターン
標準的なルール条件は、実際にたまたま存在する 1 つまたは複数のオブジェクトがそれらの条件と一致する可能性があるという意味で、存在条件として表すことができます。 RetePlus 実行モードには、否定パターン と呼ばれる補足概念があります。 特定のオブジェクトが作業メモリーに存在しないことを表すには、次に示すように、オブジェクトの条件の前に not キーワードを置きます。
not Fish(type==eel);
対応する肯定パターンと一致するオブジェクトがないため、この否定パターンの場合、マッチングは成功します。
Fish(type==eel);
反対に、次の否定パターンの場合、
not Fish(type==angel);
対応する肯定パターンと一致するオブジェクトがあるという単純な理由で、マッチングは成功しません。
Fish(type==angel);
オブジェクトの通知
RetePlus 実行モードには、以下に示す個々の操作を制御するステートメントがあります。
オブジェクトの挿入
insert ステートメントを使用して、新しいオブジェクトを作成し、それを作業メモリーに挿入することができます。 このキーワードの後に、クラスの名前と、作成するオブジェクトの属性の値を指定します。
次に、新しい Course オブジェクトの作成に関する例を示します。このオブジェクトの属性 department および number はそれぞれ値 History および 324 を取ります。
insert Course(History,324);
insert 操作を処理する方法には 2 つの可能性があります。
オブジェクトが作業メモリーに既に存在する。 この場合、挿入操作は更新と同様です。
オブジェクトが作業メモリーに存在しない。 この場合、オブジェクトは作業メモリーに挿入され、対応するクラスとそのスーパークラスの挿入デーモンが呼び出され (存在する場合)、アジェンダが更新されます。
オブジェクトのリトラクト
retract ステートメントを使用して、ルール変数にバインドされているオブジェクトを作業メモリーから削除することができます。
次の例では、retract プリミティブによって、?c 変数にバインドされているオブジェクトが削除されます。
rule RemoveCourse {
when {
?c: Course(department == History; number == 254);
}
then {
retract ?c;
}
};
対応するクラスの retract デーモンが呼び出され (存在する場合)、それに従ってアジェンダが更新されます。 作業メモリーからオブジェクトをリトラクトすると、論理オブジェクトはその理由付けを 1 つ以上失う可能性があります。
オブジェクトの更新
Java™によってオブジェクトが変更された場合、その変更は. Decision Server によって認識されません。 これは、によって管理されるデータが、変更されたオブジェクト Decision Server の新しい内容と一致しなくなることを意味します。
不整合を回避するため、このようなオブジェクトでは update ステートメントを呼び出す必要があります。 このステートメントにより、変更されたオブジェクトの新しい内容に基づいて内部構造を更新することが Decision Server 可能になります。
次のルールでは、最初のアクションによって number 属性が変更されます。 その後、オブジェクトが変更されたことを Decision Server 通知するためにプリミティブ update が呼び出される。
rule NumberingUpdate {
when {
?c: Course(department == "history"; number > 300);
}
then {
?c.updateNumbering(); // This call modifies ?c
update ?c;
}
};を使用しない場合は modify、オブジェクトが変更されたことを に Decision Server 通知するために プリミティブ update を使用する必要があります。 変更の Decision Server 通知を忘れると、状態の不整合が生じる。
ネットワーク操作
RetePlus ネットワークは、ルールと条件の数を最小にすることができます。
RetePlus ネットワーク操作
RetePlus ネットワークは、ルールをインデックス付けすることで、作業メモリーが変更されるたびに評価する必要があるルールと条件の数を最小限に抑えています。 このネットワークでは、ルール間でテストを共有し、変更を増分的に伝搬することによって、評価の数を最小限に抑えています。 すべてのテストが完了すると、ネットワークによってルールが指定されます。
一般に、ルールを実行すると作業メモリーが変更されます。 これらのルールが参照する作業メモリー内のオブジェクトが、挿入、削除、および変更される可能性があります。 このネットワークは、ルールの実行によって推論された変更を処理し、実行対象の新しいルール・セットを生成します。
作業メモリーで変更が発生すると、その変更の性質に応じて以下の 2 つのことが発生する可能性があります。
作業メモリーへのオブジェクトの挿入がある場合 (肯定)、ルールを実行することができます。
作業メモリーからのオブジェクトの削除がある場合 (否定)、ルールをアジェンダから削除する必要があります。 アジェンダとは、実行対象の現在のルール・セットが保持される場所です。
このプロセスは、アジェンダにルール・インスタンスが存在しなくなるまで繰り返し実行されます。
単純条件では、作業メモリーにその条件と一致するオブジェクトが含まれていないと、not 条件は true を返します。
RetePlus ネットワークの例
RetePlus ネットワークを説明するために、ここでは、簡単な filter ルールを使用します。このルールは、ルール言語で記述され、A、B、および C というクラスを参照します。
rule filter {
when {
A (a1==3; ?x:a2);
B (b1==2; ?y:b2; b3==?x);
C (c1==?y);
}
then {
System.out.println("filter");
}
}
クラス属性は、次のとおりです。
Aクラスにはa1およびa2という 2 つの属性があります。B クラスには
b1、b2およびb3という 3 つの属性があります。Cクラスにはc1というただ 1 つの属性があります。
作業メモリーには次のオブジェクトが含まれているとします。
A( a1=3 a2=10 )
B( b1=2 b2=4 b3=10 )
B( b1=2 b2=7 b3=10 )
C( c1=4 )
RetePlus ネットワーク構造
RetePlus ネットワークは、3 つのゾーンで構成されるグラフとして表すことができます。
- 判別ツリー
判別木はテストを行うパターンマッチングプロセスである。 これらのテストは、ネットワークの上部にダイヤモンドの形状で表されます。 テストは、オブジェクトのクラスとその属性の値に関係します。 このツリーへの入力は、作業メモリー内の現在の各オブジェクトを表すトークン で構成されます。
パターンが 1 つのオブジェクトとその属性のみを処理する場合、そのパターンは判別テストと見なされます。 それが組み合わせの場合は、結合と呼ばれます。これらは、グラフの下部に表示されます。
- アルファ・ノード
アルファ・ノード は、判別ツリーのテストに合格するトークンごとに、ネットワークの次のレベルに作成されます。 各ノードは 1 つまたは複数のトークンで構成されます。トークンは、角が丸い長方形で表されます (この図には 3 つのアルファ・ノードがあります)。 1 つのアルファ・ノードに、2 つの B クラスのトークンが含まれています。 他の 2 つのノードには、それぞれ 1 つのクラス・トークン (A クラスと C クラスのトークン) のみが含まれています。
- テストとタプル
ネットワークの 3 つの目のゾーンは、オブジェクトの複数のクラスのトークンと一致します。 結果として作成されるノードはタプル と呼ばれます。タプルは複数のトークンで構成されます。 属性
a2とb3の間の等価テストにより 2 つのトークン・ペアからなるノードが生成され、次いで、属性b2とc1の間のテストによりトークンのトリプレットがフィルタリングによって除去されます。 RetePlus ネットワークでは、通常、この種類のタプルは結合 ノードと呼ばれます。
オブジェクトの追加
RetePlus ネットワークのこの概念をさらに詳しく説明するため、作業メモリーに追加オブジェクトを挿入するとします。 追加されるオブジェクトは C クラスのオブジェクトで、その c1 属性の値は 7 です。
C( c1=7 )
現段階では、ノードのすべてのテストが実施された時点で、第三のテスト C (c1==?y); (class
of object = C)のみが満たされている。 子ノードのテストは、トークンがネットワーク内を降りていく間、続行されます。
ここでは、判別ツリーに子ノードはありません。 このため、オブジェクトはアルファ・ノードに直接格納されます。
トークンが 2 番目の結合ノード B (b1==2; ?y:b2; b3==?x)に到達すると、結合ノードのメモリーと、結合ノードに到着したばかりのトークンに含まれる C オブジェクトの隣に保管されているペアの各 B オブジェクト間でテストが実行されます。 テストは 2 つ目のペアの B オブジェクトで満たされます。 そのため、先に進み、2 つ目のペアとトークン内のオブジェクトで構成されるトリプレットを作成することができます。
このトリプレットを作成することによって、実際に、ネットワーク全体での下降が完了し、filter ルールの新しいインスタンスを実行することができます。
オブジェクトの削除
次に、作業メモリーに追加したオブジェクトを削除するとします。
判別ツリー内でのトークンの進行は、オブジェクトの追加の場合と同じですが、アルファ・ノードに否定トークンが達すると、そのトークンに含まれているオブジェクトが削除されます。
トークンが 2 つ目の結合ノードに達すると、トークンにオブジェクトが含まれているすべてのトリプレットが削除され、トークンはネットワーク内を進み続けます。
オブジェクトの追加の例に示すように、ルール・ノードに達します。 トークン内のオブジェクトに対応する条件を満たすオブジェクトが含まれている filter ルールのインスタンスがアジェンダから削除されます。