[JAVA] Die Welt der Clara-Regeln (1)
In mir wurde plötzlich über eine Bibliothek namens clara-rules gesprochen, daher habe ich sie schnell zusammengefasst.
Übersicht / Funktionen
- Eine Bibliothek, die eine Implementierung der Regelengine bereitstellt
- Trennen Sie das Domänenwissen vom Code
- Verfügbar für beide clj / cljs
- Natürlich in Java erhältlich
- Es gibt auch ein Video des Vortrags des Autors selbst [1] [[2]](https://www.youtube.com/watch?v = zs5Rueo42TA)
- Es gibt auch ein Video einer neueren Vorlesung
Regel? Motor?
- Der Ursprung des Expertensystems
――Es war eine Zeit lang beliebt, weil es attraktiv war, dass Geschäftsanwender Probleme lösen konnten, ohne einen Programmierer zu kontaktieren, wenn nicht genügend Programmierer vorhanden waren, aber es gab eine Grenze.
--clara-rules richtet sich an Programmierer und nicht an Geschäftsbenutzer, da praktisch jede Regel Code ist.
Was kann gelöst werden
- Wenn Sie eine Logik haben und diese als Funktionsaufruf ausdrücken, müssen Sie explizit schreiben, dass sie die Informationen übergibt / empfängt, die die Logik benötigt.
- Die für die Logik erforderlichen Informationen ändern sich → Erfordert zwangsläufig ein Refactoring
- Es ist nicht erforderlich, Informationen zu schreiben, die über Regeln übergeben / empfangen werden sollen.
session
- Darstellung des Staates
- Einfügen / Zurückziehen, um Fakten hinzuzufügen oder zu entfernen
- Die Tatsache wird durch eine Instanz des Clojure-Datensatzes dargestellt
- Wenden Sie Regeln auf Fakten an, die einer Sitzung mit Feuerregeln hinzugefügt wurden
- Unbezahlbarer Wert (Einfügevorgang gibt eine neue Sitzung zurück. Die alte Sitzung bleibt unverändert)
- Wie Clojure
- Tatsächlich ist es so konzipiert, dass es mit einem Threading-Makro betrieben werden kann.
- mk-session(Clojure only)
- Ohne Argumente Wenden Sie die Regeln im aktuellen Namespace an
--defsession (gibt den Namespace mit der Regel an)
defrule
Makro
- Makro zum Schreiben von Regeln
- Es gibt eine rechte und eine linke Seite
- Getrennt von
=>
- Schreiben Sie eine Beurteilungslogik auf die linke Seite (mehrere können geschrieben werden)
- Beschreiben Sie, was passiert, wenn das Urteil auf der rechten Seite wahr wird
- Kann Nebenwirkungen verursachen
- Sie können der aktuellen Sitzung auch Fakten hinzufügen
Einfaches Beispiel
(defrecord Num [number])
(defrule is-two
[Num (= number 2)] => (println "Two!"))
(-> (mk-session)
(insert (Num 4)))
(fire-rules))
;;Two!
Abfrage?
- Überprüfen Sie, ob es Ihnen gut geht!
- Anfrage auch bearbeiten. .. .. ??
Andere verschiedene Gefühle usw.
――Obwohl es nicht spezifiziert ist, habe ich das Gefühl, dass es etwas gibt, das ich zuerst als Clara-Regeln bezeichnen möchte, und ich habe Clojure für seine Implementierung ausgewählt.
――Ich weiß nicht, wie glücklich ich mit einem einfachen Beispiel bin, also muss ich noch lernen.
- Es scheint, dass JavaScript Nools und Ruby Wongi hat.
――Ich hatte das Gefühl, dass das dynamische Generieren von Regeln nicht unterstützt wird.
- In der Defrule habe ich mich gefragt, ob ich die Protokollmethode des Typs auf der linken Seite verwenden könnte, aber der Autor hat mir gesagt, dass es mit Slack möglich ist.
Thanks for the clarification ryanbrush!
(defprotocol IFoo
(test-foo [this]))
(deftype Foo []
IFoo
(test-foo [this] true))
(defrule is-foo
[Foo (test-foo this;;Es sieht aus wie ein Symbol, das automatisch innerhalb des Bereichs gebunden wird
)]
=> (println "is a foo"))
(-> (mk-session)
(insert (Foo.))
(fire-rules))
;;is a foo
Fortsetzung