RetePlus-Algorithmus

RetePlus ist ein Regelausführungsmodus, der auf dem Rete-Algorithmus basiert. Er stützt sich auf einen Arbeitsspeicher und eine Agenda und unterstützt negative Muster, Objektbenachrichtigung und logische Objekte.

RetePlus ist die Decision Server -Erweiterung, die auf dem Rete-Algorithmus basiert. Im RetePlus-Modus verwendet die Regelausführung eine Umgebung, die auf einem Arbeitsspeicher und einer Agenda basiert.

Arbeitsspeicher und Agenda

Im Ausführungsmodus RetePlus funktioniert die Regelengine mit Arbeitsspeicher und einer Agendaund fügt Regelinstanzen zur Ausführung hinzu, wenn Bedingungen erfüllt sind.

Arbeitsspeicher

Im Ausführungsmodus RetePlus wird eine Regelengine in Decision Server paarweise mit einem Arbeitsspeicherverbunden. Der Arbeitsspeicher enthält alle Objekte, die im zugeordneten Engine-Objekt enthalten sind. Sie können den Arbeitsspeicher ändern, indem Sie eine Anweisung im Aktionsteil einer Regel hinzufügen oder die Anwendungsprogrammierschnittstelle (API) verwenden. Auf diese Weise ist die Regelengine über die Objekte, die sich im Arbeitsspeicher befinden, und alle mit diesen Objekten verknüpften Objekte informiert. Die Regelengine kann nur Objekte verwenden, die über den Arbeitsspeicher zugänglich sind.

Programm

In der Agenda speichert Decision Server die Regeln, deren Muster übereinstimmen. Jede Regel, die in die Agenda aufgenommen wird, wird als instanziiert bezeichnet und wird zu einer Regelinstanz(siehe Regelinstanzen).

In der Agenda werden Regelinstanzen gespeichert, die für die Ausführung infrage kommen. Wenn die Agenda leer ist, hat die Ausführung keine Wirkung. In die Agenda eingefügte Regeln werden als zutreffend oder infrage kommend bezeichnet. Häufig kommen in der Agenda mehrere Regeln infrage. Folglich muss die Regelmaschine über eine Möglichkeit verfügen, entscheiden zu können, welche bestimmte Regel in der Agenda ausgeführt werden soll.

In der Agenda sind die Regelinstanzen nach drei Kriterien geordnet, die bestimmen, welche Regel an erster Stelle ausgeführt werden soll. Mit der Implementierung komplexerer Funktionen wird eine zusätzliche Ausführungssteuerung angeboten (siehe Objektbenachrichtigungen).

Refraktion

Eine bereits ausgeführte Regelinstanz kann nicht erneut in die Agenda eingefügt werden, wenn kein neuer Sachverhalt eingetreten ist, d. h. wenn keines der mit der Regel abgeglichenen Objekte geändert wurde, oder wenn kein neues Objekt durch die Regel abgeglichen wird.

Das Refraktionsprinzip erzwingt, dass nur eine einzige Regelinstanz für ein bestimmtes Tupel erstellt wird. Da die Dateneinheit für einen Enginezyklus der Arbeitsspeicher ist, kann die Engine ohne großen Aufwand alle möglichen Tupel aufzeichnen und prüfen, ob es nur eine Regelinstanz für jedes Tupel gibt.

Sehen Sie sich beispielsweise den folgenden Regelsatz an:

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;
}

Wenn das Objekt Person(18,true) in den Arbeitsspeicher eingefügt wird, erzeugt das Refraktionsprinzip den folgenden Ausführungstrace:

  1. cure
  2. incrementAge

Sie können die wiederholt anwendbare Eigenschaft in der Regel incrementAge hinzufügen:

rule incrementAge {
 property com.ibm.rules.engine.repeatable=true;
when {
  p: Person(!sick; age < 50);
} then {
  p.age += 1;
}

Wenn das Objekt Person(18,true) in den Arbeitsspeicher eingefügt wird, erzeugt die wiederholt anwendbare Eigenschaft den folgenden Ausführungstrace:

  1. cure
  2. incrementAge
  3. incrementAge
  4. incrementAge
  5. ...
  6. incrementAge

    Bis die Bedingung age < 50 mit 'false' als nicht zutreffend ausgewertet wird.

Wiederholt anwendbare Regeln
Um das Refraktionsprinzip zu durchbrechen, können Sie die boolesche Regeleigenschaft com.ibm.rules.engine.repeatable verwenden. In der Entscheidungsengine müssen Sie diese Eigenschaft verwenden, um die Regelsätze zu kennzeichnen, die wiederholt anwendbar sein sollen.
  • Wenn eine Regel nicht wiederholt anwendbar ist, verhindert das Refraktionsprinzip, dass eine Regelinstanz erneut in der Agenda veröffentlicht wird.
  • Wenn eine Regel wiederholbar ist, kann sie erneut als Regelinstanz in die Agenda eingefügt werden, wenn die Änderung an den Bedingungsobjekten der Regel vorgenommen wird.
Aktualität

Wenn zwei Regelinstanzen die gleiche Priorität haben, wird die Regel, die mit dem jüngsten Objekt übereinstimmt (d. h. dem zuletzt eingefügten, geänderten oder zurückgezogenen Objekt), zuerst ausgeführt.

Priorität und Aktualität werden verwendet, um Konflikte zu lösen, wenn mehrere Regelinstanzen zu derselben Zeit für die Ausführung infrage kommen. Wenn nach Anwendung aller angegebenen Konfliktlösungsmethoden immer noch mehrere Regelinstanzen als Kandidaten übrig bleiben, verwendet die Engine interne Metaregeln. Auf diese Weise wird sichergestellt, dass bei der Regelausführung immer dieselbe Reihenfolge mit denselben Bedingungen befolgt wird.

Beispiel für die Regelausführungsreihenfolge

Das folgende technische Regelbeispiel zeigt die Reihenfolge an, in der Regeln ausgeführt werden:


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");
   }
};

Angenommen, das Objekt angel wurde aus der Anwendung mit der API eingefügt und daher in den Arbeitsspeicher eingefügt und angenommen, es werden alle Regeln ausgeführt, die ausgeführt werden können.

Die Regeln werden in der folgenden Reihenfolge ausgeführt:

  1. Regel init: Da das Objekt angel aus der Anwendung eingefügt wurde, ist die Regel init die einzige Regel, die ausgeführt werden kann. Sie fügt die Objekte clown und dann das Objekt dascyllus in den Arbeitsspeicher ein. Das aktuellste Objekt ist deshalb dascyllus.

  2. Regel first: Diese Regel wird vor der Regel second ausgeführt. Das jüngste (neueste) Objekt, auf das diese beiden Regeln zutreffen, ist dasselbe. Das erste Objekt hat jedoch eine höhere Priorität als das zweite Objekt und diese Priorität ist maßgeblich für die Ausführungsreihenfolge der Objekte.

  3. Regel second: Diese Regel wird vor der Regel third ausgeführt. Die zweite (second) und die dritte (third) Regel haben dieselbe Priorität, aber das Objekt dascyllus ist aktueller als das Objekt clown.

  4. Regel third: Diese Regel wird vor der Regel last ausgeführt. Obwohl das Objekt dascyllus aktueller ist als clown, hat die third-Regel eine höhere Priorität als die last-Regel.

  5. last-Regel

Regelinstanzen

Eine Regelinstanz wird der Agenda hinzugefügt, wenn die Objekte im Arbeitsspeicher den Bedingungsteil dieser Regel erfüllen.

Angenommen, die folgende technische Regel wird verwendet:


rule rule1 {
   when {
      Fish(color == green; type == shark);
      Fish(type == trigger);
   }
   then {...}
};

In diesem Fall werden die folgenden Regelinstanzen in die Agenda aufgenommen:

Regel Regel Regel Regel
rule1(A,C®) rule1(A,D) rule1(B,C) rule1(B,D)

In diesem Beispiel sehen Sie, dass eine Regelinstanz ein dynamisches Konzept ist. Die Regelinstanz wird durch eine Kombination von Objekten im Arbeitsspeicher erstellt, die den in der Regel angegebenen Mustern entsprechen. Eine Regel hingegen ist ein statisches Konzept.

Negative Muster

Standardregelbedingungen können insofern als existenziell beschrieben werden, als sie einem oder mehreren Objekten entsprechen können, die tatsächlich vorhanden sind. Im Ausführungsmodus "RetePlus" gibt es ein ergänzendes Konzept, die negativen Muster. Um das Nichtvorhandensein eines bestimmten Objekts im Arbeitsspeicher auszudrücken, wird der Bedingung des Objekts das Schlüsselwort not vorangestellt, wie im Folgenden gezeigt:


not Fish(type==eel);

Dieses negative Muster hat einen erfolgreichen Abgleich zur Folge, weil es kein Objekt gibt, das mit dem entsprechenden positiven Muster übereinstimmt:


Fish(type==eel);

Das negative Muster


not Fish(type==angel);

hingegen hat keinen erfolgreichen Abgleich zur Folge, und zwar aus dem einfachen Grund, dass es ein Objekt gibt, das mit dem positiven Muster übereinstimmt:


Fish(type==angel);

Objektbenachrichtigungen

Im Ausführungsmodus "RetePlus" stehen Ihnen Anweisungen zur Verfügung, mit denen Sie die folgenden individuellen Operationen steuern können:

Objekteinfügung

Mit der Anweisung insert können Sie ein neues Objekt erstellen und dieses in den Arbeitsspeicher einfügen. Diesem Schlüsselwort folgen der Name der Klasse und die Werte der Attribut des zu erstellenden Objekts.

Im Folgenden sehen Sie ein Beispiel, in dem ein neues Objekt Course erstellt wird, dessen Attribute department und number die Werte History bzw. 324 haben:


insert Course(History,324);

Es gibt zwei Möglichkeiten für die Verarbeitung einer Einfügeoperation (insert):

  • Das Objekt befindet sich bereits im Arbeitsspeicher. In diesem Fall entspricht die Einfügeoperation einer Aktualisierung.

  • Das Objekt befindet sich nicht im Arbeitsspeicher. In diesem Fall wird das Objekt in den Arbeitsspeicher einfügt, und der Einfügedämon der entsprechenden Klasse und der zugehörigen Superklassen, sofern vorhanden, wird aufgerufen, um die Agenda zu aktualisieren.

Objekte entfernen

Mit der Anweisung retract können Sie ein Objekt aus dem Arbeitsspeicher entfernen, das an eine Regelvariable gebunden ist.

Im folgenden Beispiel entfernt das Basiselement retract das an die Variable ?c gebundene Objekt:


rule RemoveCourse {
   when {
      ?c: Course(department == History; number == 254);
   }
   then {
      retract ?c;
   }
};

Der Dämon retract der entsprechenden Klasse, sofern vorhanden, wird aufgerufen, und die Agenda wird entsprechend aktualisiert. Das Zurückziehen eines Objekts aus dem Arbeitsspeicher kann dazu führen, dass ein logisches Objekt eine oder mehrere seiner Begründungen verliert.

Objektaktualisierung

Wenn ein Objekt von Java™geändert wird, werden die Änderungen von Decision Servernicht erkannt. Dies bedeutet, dass die von Decision Server verwalteten Daten nicht mit dem neuen Inhalt des geänderten Objekts konsistent sind.

Zur Vermeidung von Inkonsistenzen muss die Anweisung update für ein solches Objekt aufgerufen werden. Mit dieser Anweisung kann Decision Server seine internen Strukturen entsprechend dem neuen Inhalt des geänderten Objekts aktualisieren.

In der folgenden Regel ändert die erste Aktion das Attribut "number". Anschließend wird das Basiselement update aufgerufen und informiert Decision Server darüber, dass das Objekt geändert wurde.


rule NumberingUpdate {
   when {
      ?c: Course(department == "history"; number > 300);
   }
   then {
      ?c.updateNumbering(); // This call modifies ?c 
      update ?c;
   }
};
Wichtig:

Wenn Sie modifynicht verwenden, müssen Sie das Basiselement update verwenden, um Decision Server darüber zu informieren, dass Objekte geändert wurden. Wenn Sie vergessen, Decision Server über Änderungen zu benachrichtigen, führt dies zu inkonsistenten Status.

Netzoperation

Das RetePlus-Netz kann die Anzahl der Regeln und Bedingungen minimieren:

RetePlus-Netzoperation

Das RetePlus-Netz indiziert Regeln, um die Anzahl der Regeln und Bedingungen zu minimieren, die ausgewertet werden müssen, wenn der Arbeitsspeicher geändert wird. Das Netz minimiert die Anzahl der Auswertungen, indem gemeinsame Tests für Regeln gemeinsam genutzt und Änderungen inkrementell weitergegeben werden. Nach Abschluss aller Tests entwirft das Netz eine Regel.

In den meisten Fällen wird beim Ausführen einer Regel der Arbeitsspeicher geändert. Objekte im Arbeitsspeicher, die von diesen Regeln referenziert werden, können eingefügt, entfernt und geändert werden. Das Netz verarbeitet die Änderungen, die sich durch die Ausführung der Regel ergeben, und erzeugt einen neuen Satz auszuführender Regeln.

Wenn eine Änderung im Arbeitsspeicher auftritt, können je nach Art der Änderung zwei Dinge eintreten:

  • Wenn ein Objekt in den Arbeitsspeicher eingefügt wird (positiv), kann die Regel ausgeführt werden.

  • Wenn ein Objekt aus dem Arbeitsspeicher entfernt wird (negativ), muss die Regel aus der Agenda entfernt werden. In der Agenda wird der aktuelle Satz auszuführender Regeln verwaltet.

Dieser Prozess wird zyklisch fortgesetzt, bis keine Regelinstanzen mehr in der Agenda vorhanden sind.

Hinweis:

Eine not-Bedingung gibt true für eine einfache Bedingung zurück, wenn der Arbeitsspeicher kein Objekt enthält, das der Bedingung entspricht.

Beispiel für ein RetePlus-Netz

Zur Veranschaulichung der Beschreibung eines RetePlus-Netzes wird jetzt eine einfache Regel filter verwendet, die in der Regelsprache geschrieben ist und auf die Klassen A, B und C verweist:


rule filter {
   when {
      A (a1==3; ?x:a2);
      B (b1==2; ?y:b2; b3==?x);
      C (c1==?y);
   }
   then {
      System.out.println("filter");
   }
}

Die Klassenattribute sind folgende:

  • Die Klasse A hat zwei Attribute, a1 und a2.

  • Die Klasse B hat drei Attribute, b1, b2 und b3.

  • Die Klasse C hat ein einziges Attribut mit dem Namen c1.

Angenommen, der Arbeitsspeicher enthält die folgenden Objekte:


A( a1=3 a2=10 )
B( b1=2 b2=4 b3=10 )
B( b1=2 b2=7 b3=10 )
C( c1=4 )

Struktur des RetePlus-Netzes

Ein RetePlus-Netz kann als Graph dargestellt werden, der sich aus drei Zonen zusammensetzt:

Diskriminierungsbaum

Ein Unterscheidungsbaum ist ein Mustervergleichsprozess , der Tests durchführt. Diese Tests werden als Rautensymbole oben im Netz dargestellt. Die Tests beziehen sich auf die Klassen von Objekten und die Werte der Objektattribute. Die Eingabe für diesen Baum setzt sich aus Token zusammen, die die einzelnen aktuellen Objekte im Arbeitsspeicher darstellen.

Wenn das Muster nur ein einziges Objekt und dessen Attribute bearbeitet, handelt es sich um einen Diskriminierungstest. Wenn es sich um eine Kombination handelt, wird dies als Verknüpfungstest bezeichnet. Diese Tests werden im unteren Teil des Graphen angezeigt.

Alphaknoten

Ein Alphaknoten wird für jedes Token, das die Tests des Diskriminierungsbaums besteht, auf der nächsten Ebene des Netzes gebildet. Jeder Knoten setzt sich aus einem oder mehreren Token zusammen, die durch Rechtecke mit abgerundeten Ecken dargestellt werden (es gibt drei Alphaknoten in der Abbildung). Ein Alphaknoten enthält zwei Token der Klasse B. Die anderen beiden Knoten enthalten nur jeweils ein einziges Klassentoken der Klasse A bzw. der Klasse C.

Tests und Tupel

Die dritte Zone des Netzes gleicht Token mehrerer Klassen von Objekten ab. Die generierten Knoten werden als Tupel bezeichnet und setzen sich aus mehreren Token zusammen. Der Gleichheitstest der Attribute a2 und b3 ergibt einen Knoten, der sich aus zwei Tokenpaaren zusammensetzt, und der Test der Attribute b2 und c1 filtert dann ein Triplet von Token heraus. In einem RetePlus-Netz werden Tupel dieser Art häufig als Join-Knoten bezeichnet.

Objekthinzufügung

Zur weiteren Veranschaulichung dieser Idee des RetePlus-Netzes wird angenommen, das ein zusätzliches Objekt in den Arbeitsspeicher eingefügt wird. Das hinzugefügte Objekt gehört der Klasse C an, und das Attribut c1 dieses Objekts hat den Wert 7.


C( c1=7 )

Wenn in dieser Phase alle Tests der Knoten ausgeführt werden, ist nur der dritte Test C (c1==?y); (class of object = C) erfolgreich. Die Tests der untergeordneten Knoten werden fortgesetzt, während das Token im Netz weitergegeben wird.

Hier gibt es keinen untergeordneten Knoten im Diskriminierungsbaum. Aus diesem Grund wird das Objekt direkt im Alphaknoten gespeichert.

Wenn das Token den zweiten Join-Knoten, B (b1==2; ?y:b2; b3==?x), erreicht, wird der Test zwischen jedem B-Objekt der Paare, die neben dem Speicher des Join-Knotens gespeichert sind, und dem C-Objekt, das in dem soeben beim Join-Knoten angekommenen Token enthalten ist, ausgeführt. Der Test ist für das B-Objekt des zweiten Paars erfolgreich. Deshalb kann der Prozess fortgesetzt und ein Triplet aus dem zweiten Paar und dem Objekt im Token erstellt werden.

Mit der Bildung dieses Triplets wurde das gesamte Netz durchgearbeitet, und es kann eine neue Instanz der Regel filter ausgeführt werden.

Objektentfernung

Angenommen, jetzt wird das dem Arbeitsspeicher soeben hinzugefügte Objekt entfernt.

Der Fortschritt des Tokens durch den Diskriminierungsbaum ist derselbe wie bei der Hinzufügung eines Objekts, aber das Ankommen des negativen Tokens im Alphaknoten bewirkt, dass das im Token enthaltene Objekt entfernt wird.

Wenn das Token im zweiten Join-Knoten ankommt, werden alle Triplets, die das Objekt im Token enthalten, entfernt, und das Token setzt seinen Weg durch das Netz fort.

Wie im Beispiel für die Hinzufügung eines Objekts wird der Regelknoten erreicht. Die Instanz der Regel filter, deren Objekte die Bedingungen erfüllen, die den Objekten im Token entsprechen, werden aus der Agenda entfernt.