Clara Ruleによるexpert system(シンプルなユースケース)

前回に引き続き、Clojureでのexpert systemであるClara Ruleを用いた実装について述べる。2017年にiku00088さんが書いた「clara-rulesの世界」のコードを参考に一部動かない所を修正したコードを掲載する。まず一番シンプルな動作コードは以下となる。

(defrecord Num  [number])

(defrule is-two
  [Num (= number 2)] => (println "Two!"))

(-> (mk-session)
    (insert (->Num 2))
    (fire-rules))
;;-> "Two!"

もう少し具体的なユースシーン(ある商品(Item)を所持金(MyMoney)で変えるかどうかを判定。商品の最終的な値段は割引率と税金で決まる(rule))でのサンプルコードを以下に示す。

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

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

次回は更にフレキシブルなアプローチである。自然文からのルールの自動生成のケースについて述べる。

コメント

  1. […] 前回に続いて、Clojureでのexpert systemであるclara-ruluesについて。Claraでは、defqueryとquery関数を用いて外部への推論結果の外部への出力を行う。以下にサンプルを示す […]

  2. […] Clara Rulesの詳細のシンプルな実装にと応用的な実装に関しては後日述べる。 […]

  3. […] Clara Ruleによるエキスパートシステム(1) 基本的な使い方 […]

  4. […] Clara Rulesによるエキスパートシステム(1) 基本的な活用 […]

  5. […] Clara Ruleによるエキスパートシステム(1) 基本的な使い方 […]

モバイルバージョンを終了
タイトルとURLをコピーしました