前回に引き続き、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!
次回は更にフレキシブルなアプローチである。自然文からのルールの自動生成のケースについて述べる。
コメント
[…] 前回に続いて、Clojureでのexpert systemであるclara-ruluesについて。Claraでは、defqueryとquery関数を用いて外部への推論結果の外部への出力を行う。以下にサンプルを示す […]
[…] Clara Rulesの詳細のシンプルな実装にと応用的な実装に関しては後日述べる。 […]
[…] Clara Ruleによるエキスパートシステム(1) 基本的な使い方 […]
[…] Clara Rulesによるエキスパートシステム(1) 基本的な活用 […]
[…] Clara Ruleによるエキスパートシステム(1) 基本的な使い方 […]