[JAVA] Le monde de Clara-Rules (2)

Dernier message

Quand j'ai touché légèrement les règles de clara et que j'ai dormi toute la nuit, je voulais en savoir plus sur ce que les règles de clara pouvaient faire, j'ai donc inventé moi-même un problème divers.

problème:

Déterminez si vous pouvez acheter un article avec votre argent (Mon argent).

--Le prix final du produit est calculé dans les étapes suivantes

  1. Remise
  2. Fiscalité --Réduction de 10% si l'article est inclus dans l'objectif de remise # {: fish: pants} --L'article a un attribut de catégorie, qui change le taux de taxe

food 0.1


                :cloth 0.2
                :alcohol 0.3})```
 ――Après la remise, si le prix taxé est inférieur à votre argent, vous pouvez l'acheter

## 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!"))

Différence entre insert! Et insert

--insert! est utilisé dans defrule pour ajouter implicitement des faits à la session courante --insert prend une session explicitement ciblée comme argument

Vous pouvez lier des variables sur le côté gauche de defrule!

Par exemple, dans l'exemple suivant sur le côté gauche de la règle DiscountItem,

Je suis lié à.

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

Test divers

(-> (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

Impressions

Suite

Recommended Posts

Le monde de Clara-Rules (2)
Le monde de Clara-Rules (4)
Le monde de Clara-Rules (1)
Le monde de Clara-Rules (3)
Le monde de Clara-Rules (5)
Jugement du calendrier
L'idée du tri rapide
L'idée de jQuery
À propos de la gestion de Null
Surveillance Docker-expliquant les bases des bases-
À propos de la description de Docker-compose.yml
Le jeu d'instancier java.lang.Void
Valeur médiane de trois valeurs
L'illusion de l'orientation objet
À propos du comportement de ruby Hash # ==
[Java] Supprimer les éléments de la liste
Suite: La parabole de la POO (omise)
Modifier seulement une partie du texte
Comprendre le mécanisme de base de log4j2.xml
À propos des bases du développement Android
'% 02d' Quel est le% de% 2?
[Rails] Vérifiez le contenu de l'objet
Remplacez le contenu du fichier Jar
[Édition Java] Histoire de la sérialisation
Vérifiez la version de Cent OS
Explication de l'ordre des itinéraires ferroviaires
J'ai lu la source de ArrayList que j'ai lu
Les bases de SpringBoot + MyBatis + MySQL
Remarque sur le chemin de request.getRequestDispatcher
Essayez HelloWorld avec la configuration minimale de Heroku Java spring-boot
J'ai lu la source d'Integer
Ceci et cela de JDK
Vérifier l'état de migration des rails
L'histoire de @ViewScoped dévore la mémoire
Filtrer les fluctuations des données brutes
Expliquer les colonnes de Spree :: Taxonomie
Un mémorandum du problème FizzBuzz
J'ai lu la source de Long
Expliquez la colonne de Spree :: Product
Diverses méthodes de la classe String
À propos du rôle de la méthode initialize
Pensez aux 7 règles d'Optionnel
Obtenez l'ID de la numérotation automatique
J'ai lu la source de Short
J'ai lu la source de Byte
Ordre de traitement dans le programme
J'ai lu la source de String
L'origine des expressions Java lambda
[Ruby] Afficher le contenu des variables
Filtrer le résultat de BindingResult [Spring]
Débogage à distance du SDK Cognos