Fight

衝 !

Advertisements

CLIPS Review

Expert System 筆記

(1)定義樣板
(deftemplate 名稱 (slot 名) (multislot 名))
ex: (deftemplate stu (slot id) (multislot name))

(2)定義規則範例
(defrule 名稱
?f<-(student tarono)
;這是註解,把某個fact的位址bind到?f
=>
(retract ?f)
;撤除此條fact
(assert (student abc))
)

(defrule r1
?f <-(student ?id)
?f2<-(stu_info (id ?id) (father ?f) (mother ?m))
;?id bind 上面那條規則的?id
=>
…..
)

(defrule r2
?f <-(student ?id)
(test (eq ?id 91610043))
; field constraint 測試 ?id 是否為 91610043
=>
….
)

註: eq 適用於各種型態的測試(symbol string number)
其他還有 neq , > , < , = , …etc.

註2: ?f 僅能bind單一的slot $?f 可以bind multislot
(含empty slot)

(3)fact範例
(student tarono)
(student (id 91610043) (name tarono))

fact注意事項
每條fact均有一個id,獨一無二。
一條fact至多僅能activate一個rule一次。
一種facts的組合僅能activate一個rule一次。

(4)Clips的強處
排序(小->大)範例:
(defrule sort
?f<-(data $?a ?b $?c ?d $?e)
(test (< ?d ?b))
=>
(retract ?f)
(assert (data $?a ?d $?c ?b $?e))
)

找出目前最大的數值:
(defrule max
(data ?num1)
(not (data ?num2&:(> ?num2 ?num1)))
;不存在?num2大於?num1
;意味著?num1就是最大
=>
(printout t "max:" ?num1 crlf) ; crlf = 換行
)

(5)其他指令
(facts) 顯示目前module的所有facts
(agenda) 顯示目前被activate的rules
(clear) 清除clipe所有狀態
(reset) 重新載入 (deffacts ….) 所定義的所有facts
(run) activate目前所有可以執行的rules
(printout t "hello world") 輸出到螢幕 t 代表 terminal
(open "test.txt" logical_name "w") 開檔模式-write 並且定義 logical_name

(6)寫作格式
(deffacts (a b c) ;initial facts
(g s s) ….
)

(deftemplate t1 (…)) ;template definition

(defrule r1 ; defrule

=>

)