2009-03-12 6 views
2

Ich versuche, ein regelbasiertes System für die Interpretation von Daten zu erstellen. Ich habe jedoch Probleme, über eine Möglichkeit zu entscheiden, die Logik zum Speichern und Interpretieren von Regeln zu konstruieren.PHP: Outlook-Stil Regel-Engine

Momentan gibt es eine Datenbankstruktur, die ziemlich komplex ist, aber alle Aspekte der Speicherung der Regeldaten behandeln wird. Die Idee ist, dass das System die Art nachahmen kann, wie MS Outlook einem Benutzer das Hinzufügen von Regeln ermöglicht.

Meine Probleme sind wie folgt:

  1. Welche Muster sollte ich diese Regeln innerhalb Objekte zu speichern verwenden?
  2. Sollte ich eval() oder richtige Objektorientierung verwenden, um die Regeln auszuführen?

Und Beispielregel könnte sein:

Hund muss Kragen in Bereich Park

hat, wobei jedes Element (Hund, haben muss, Kragen, in dem Bereich, Park) ist eine separate Logik, die interpretiert werden soll.

Jeder allgemeine Hinweis auf die oben genannten Fragen wird sehr geschätzt!

Antwort

1

Ich habe noch nie ein System implementiert, wie Sie es in einem "realen" Kontext beschreiben, aber ich habe mit ihnen eine beträchtliche Menge als Hobby-Projekte gespielt. Meine bevorzugte Vorgehensweise besteht darin, eine Art von Logiksprache wie Prolog zu verwenden, um Aussagen zu machen und sie zu überprüfen. Sie haben Behauptungen, wo der Park ist, was es bedeutet, etwas zu haben, was ein Hund ist, und dann würden Sie eine Regel ziemlich genau wie Ihr Beispiel in Klammern am Ende Ihres Beitrags machen. Es tut mir leid, dass mein Prolog zu rostig ist, um Ihnen ein nützliches Beispiel zu geben ... Ich habe zu lange mit selbstgewonnenen Inferenzsprachen gespielt.

Es gibt Prolog-Interpreter für die Einbettung in den meisten Sprachen, obwohl ich mir über PHP5 nicht sicher bin. Sie könnten etwas einfaches zusammenstellen, das forward-chaining inference auf Regel Datenstrukturen Ihrer eigenen Schöpfung in ziemlich kurzer Reihenfolge, wenn Sie einen Prolog-Interpreter nicht finden können. Sie könnten an diesen notes auf automatisierte Inferenz interessiert sein.

+0

Prolog würde es wahrscheinlich zu weit von PHP nehmen, aber das ist eine gute Idee.Könnten Sie vielleicht eine Implementierung für First Order Logic vorschlagen? – tombazza

+0

Was meinen Sie mit einer "Implementierung für FOL"? Der letzte Link in meinem Beitrag ist im Grunde eine Anleitung zur Implementierung Ihrer eigenen FOL Inferenz-Engine. Sie können auch das Cyc-Projekt ausprobieren: http://www.opencyc.org/ – rmeador

+0

Ja, ich hatte gehofft, vielleicht hat jemand schon etwas gemacht, das diesen logischen Prozess implementiert. Zumindest kann ich überprüfen, wie sie die Code-Basis davon erstellt haben! – tombazza

1

Wahrscheinlich ist diese Antwort für Sie zu trivial/offensichtlich, aber ich dachte gerade darüber nach, wie ich etwas in meinem gegenwärtigen bestehenden Projekt, das eine Zend Framework-Anwendung ist, lösen würde. Ich dachte an den Filter- und ValidatorChain, den ZF benutzt. Ich nehme an, Sie haben eine endliche Anzahl von möglichen Eingabeobjekten, eine endliche Anzahl von Bedingungen/Einschränkungen und eine endliche Anzahl von Aktionen. In diesem Fall würden Sie zuerst ein Objekt instanziieren und es gegen eine Kette von Bedingungen (Validatoren) ausführen. Wenn alle Bedingungen erfüllt sind, führen Sie das Objekt gegen actionChain aus. Hier müsste ich wahrscheinlich ein Aktionsprioritätssystem implementieren, da einige Aktionen vor anderen ausgeführt werden müssen. Wie "Senden einer Benachrichtigung" und dann "Löschen" des betreffenden Objekts. Also würde ich in ZF einen benutzerdefinierten Validator für jede Bedingung/Einschränkung erstellen. Ich glaube nicht, dass das Outlook-System sehr intelligent ist, was bedeutet, dass die Validatoren nicht sehr allgemein sind.

In der db könnte es eine Tabelle für tatsächliche Regeln geben, eine für die Bedingungen und eine für Aktionen. Dann könnte es zwei Viele-zu-Viele-Tabellen geben, die die Regel mit allen erforderlichen Bedingungen und Aktionen verbinden.

+0

Die Idee, Ketten zu verwenden, ist tatsächlich sehr interessant, da sie die Ketten in einem Objekt enthält, die dann in eine andere Kette und so weiter eingekettet werden können – tombazza