[JAVA] Die Welt der Clara-Regeln (2)

Letzter Beitrag

Als ich Clara-Regeln leicht berührte und über Nacht schlief, wollte ich mehr darüber wissen, was Clara-Regeln tun können, also habe ich mir selbst ein anderes Problem ausgedacht.

Problem:

Bestimmen Sie, ob Sie einen Artikel mit Ihrem Geld kaufen können (Mein Geld).

  1. Rabatt
  2. Besteuerung

food 0.1


                :cloth 0.2
                :alcohol 0.3})```
 ――Nach dem Rabatt können Sie ihn kaufen, wenn der besteuerte Preis unter Ihrem Geld liegt

## Code

```clj
(require '[clara.rules :refer [defrule fire-rules insert insert! mk-session]])

(def discounted-items #{:fish :pants})

(def tax-rates {:food 0.1 :cloth 0.2 :alcohol 0.3})

(defrecord MyMoney [amt])

(defrecord Tax [category rate])

(defrecord Item [id price category])

(defrecord DiscountedItem [discounted-price category])

(defrecord TaxedItem [final-price])

(defrule DiscountItem
  [Item (= ?id id) (= ?category category) (= ?price price)]
  =>
  (println "Item is" ?id)
  (println "Original Price is" ?price)
  (println "Discounted item?" (some? (discounted-items ?id)))
  (insert! (->DiscountedItem (* ?price 0.9) ?category)))

(defrule TaxItem
  [DiscountedItem (= ?category category) (= ?discounted-price discounted-price)]
  =>
  (println "Tax rate is " (?category tax-rates))
  (insert! (->TaxedItem (+ ?discounted-price (* ?discounted-price (?category tax-rates))))))

(defrule EnoughMoney
  [MyMoney (= ?amt amt)]
  [TaxedItem (= ?final-price final-price) (> ?amt final-price)]
  =>
  (println "Final price:" ?final-price)
  (println "You have enough money!"))

(defrule NotEnoughMoney
  [MyMoney (= ?amt amt)]
  [TaxedItem (= ?final-price final-price) (not (> ?amt final-price))]
  =>
  (println "Final price:" ?final-price)
  (println "You do not have enough money!"))

Unterschied zwischen Insert! Und Insert

--insert! wird in defrule verwendet, um der aktuellen Sitzung implizit Fakten hinzuzufügen --insert nimmt eine explizit gezielte Sitzung als Argument

Sie können Variablen auf der linken Seite von defrule binden!

Beispiel: Im folgenden Beispiel auf der linken Seite der DiscountItem-Regel:

--Item-ID-Feld? Id

Ich bin gebunden an.

[Item (= ?id id) (= ?category category) (= ?price price)]

--Variablen beginnen mit ?

Verschiedenes Test

(-> (mk-session)
    (insert (->MyMoney 199) (->Item :fish 200 :food))
    (fire-rules))
;;Item is :fish
;;Original Price is 200
;;Discounted item? true
;;Discounted Price 180.0
;;Tax rate is  0.1
;;Final price: 198.0
;;You have enough money!

(-> (mk-session)
    (insert (->MyMoney 197) (->Item :fish 200 :food))
    (fire-rules))
;; Item is :fish
;; Original Price is 200
;; Discounted item? true
;; Discounted Price 180.0
;; Tax rate is  0.1
;; Final price: 198.0
;; You do not have enough money!

(-> (mk-session)
    (insert (->MyMoney 215) (->Item :pants 200 :cloth))
    (fire-rules))
;; Item is :pants
;; Original Price is 200
;; Discounted item? true
;; Discounted Price 180.0
;; Tax rate is  0.2
;; Final price: 216.0
;; You do not have enough money!

(-> (mk-session)
    (insert (->MyMoney 217) (->Item :pants 200 :cloth))
    (fire-rules))
;; Item is :pants
;; Original Price is 200
;; Discounted item? true
;; Discounted Price 180.0
;; Tax rate is  0.2
;; Final price: 216.0
;; You have enough money!

(-> (mk-session)
    (insert (->MyMoney 521) (->Item :beer 400 :alcohol))
    (fire-rules))
;; Item is :beer
;; Original Price is 400
;; Discounted item? false
;; Discounted Price 400
;; Tax rate is  0.3
;; Final price: 520.0
;; You have enough money!

(-> (mk-session)
    (insert (->MyMoney 519) (->Item :beer 400 :alcohol))
    (fire-rules))
;; Item is :beer
;; Original Price is 400
;; Discounted item? false
;; Discounted Price 400
;; Tax rate is  0.3
;; Final price: 520.0
;; You do not have enough money!

;;Forgot to insert MyMoney, what happens?
(-> (mk-session)
    (insert (->Item :beer 400 :alcohol))
    (fire-rules))
;; Item is :beer
;; Original Price is 400
;; Discounted item? false
;; Discounted Price 400
;; Tax rate is  0.3

Impressionen

Fortsetzung

Recommended Posts

Die Welt der Clara-Regeln (2)
Die Welt der Clara-Regeln (4)
Die Welt der Clara-Regeln (1)
Die Welt der Clara-Regeln (3)
Die Welt der Clara-Regeln (5)
Beurteilung des Kalenders
Die Idee der schnellen Sortierung
Die Idee von jQuery
Über den Umgang mit Null
Docker-Überwachung - Erläuterung der Grundlagen der Grundlagen
Informationen zur Beschreibung von Docker-compose.yml
Das Spiel der Instanziierung von java.lang.Void
Medianwert von drei Werten
Die Illusion der Objektorientierung
Über das Verhalten von Ruby Hash # ==
[Java] Löschen Sie die Elemente von List
Fortsetzung: Das Gleichnis von OOP (weggelassen)
Ändern Sie nur einen Teil des Textes
Verstehen Sie den grundlegenden Mechanismus von log4j2.xml
Über die Grundlagen der Android-Entwicklung
'% 02d' Was ist der% von% 2?
[Schienen] Überprüfen Sie den Inhalt des Objekts
Ersetzen Sie den Inhalt der Jar-Datei
[Java Edition] Geschichte der Serialisierung
Überprüfen Sie die Version von Cent OS
Erläuterung der Reihenfolge der Schienenrouten
Ich habe die Quelle von ArrayList gelesen, die ich gelesen habe
Die Grundlagen von SpringBoot + MyBatis + MySQL
Hinweis zum Pfad von request.getRequestDispatcher
Probieren Sie HelloWorld mit der Mindestkonfiguration von Heroku Java Spring-Boot aus
Ich habe die Quelle von Integer gelesen
Dies und das von JDK
Überprüfen Sie den Migrationsstatus von Schienen
Die Geschichte von @ViewScoped, die Speicher verschlingt
Filtern Sie die Schwankungen der Rohdaten
Erklären der Spalten von Spree :: Taxonomy
Ein Memorandum über das FizzBuzz-Problem
Ich habe die Quelle von Long gelesen
Erklären Sie die Spalte von Spree :: Product
Verschiedene Methoden der String-Klasse
Informationen zur Rolle der Initialisierungsmethode
Denken Sie an die 7 Regeln von Optional
Holen Sie sich die ID der automatischen Nummerierung
Ich habe die Quelle von Short gelesen
Ich habe die Quelle von Byte gelesen
Reihenfolge der Verarbeitung im Programm
Ich habe die Quelle von String gelesen
Der Ursprung von Java-Lambda-Ausdrücken
[Ruby] Zeigt den Inhalt von Variablen an
Filtern Sie das Ergebnis von BindingResult [Spring]
Remote-Debugging von Cognos SDK