专家系统/Jess
外观
< 专家系统
Jess 是一个用于 Java 平台的规则引擎,它是 CLIPS 的超集,由桑迪亚国家实验室的欧内斯特·弗里德曼-希尔开发。它最初是在 1995 年后期编写的。
它提供了基于规则的编程,适用于自动化专家系统,通常被称为 专家系统外壳。近年来,智能代理系统也得到发展,它们依赖于类似的功能。
Jess 不使用过程式范式,其中一个程序只有一个循环,并且该循环只激活一次,而是使用 Jess 使用的声明式范式,通过称为 模式匹配 的过程,持续将规则集合应用于事实集合。规则可以修改事实集合,或者可以执行任何 Java 代码。
Jess 可用于构建 Java servlet、EJB、applet 和完整的应用程序,这些应用程序使用声明性规则形式的知识来得出结论和进行推断。由于许多规则可能匹配许多输入,因此几乎没有有效的通用匹配算法。Jess 规则引擎使用 Rete 算法。
虽然 CLIPS 作为开源软件获得许可,但 Jess 不是开源软件。
代码示例
; is a comment
(bind ?x 100)
; x = 100
(deffunction max (?a ?b)
(if (> ?a ?b) then ?a else ?b))
(deffacts myroom
(furniture chair)
(furniture table)
(furniture bed)
)
(deftemplate car
(slot color)
(slot mileage)
(slot value)
)
(assert (car (color red) (mileage 10000) (value 400)))
示例代码
(clear)
(deftemplate blood-donor (slot name) (slot type))
(deffacts blood-bank ; put names & their types into [[working memory(jess)|working memory]]
(blood-donor (name "Alice")(type "A"))
(blood-donor (name "Agatha")(type "A"))
(blood-donor (name "Bob")(type "B"))
(blood-donor (name "Barbara")(type "B"))
(blood-donor (name "Jess")(type "AB"))
(blood-donor (name "Karen")(type "AB"))
(blood-donor (name "Onan")(type "O"))
(blood-donor (name "Osbert")(type "O"))
)
(defrule can-give-to-same-type-but-not-self ; handles A > A, B > B, O > O, AB > AB, but not N1 > N1
(blood-donor (name ?name)(type ?type))
(blood-donor (name ?name2)(type ?type2 &:(eq ?type ?type2) &: (neq ?name ?name2) ))
=>
(printout t ?name " can give blood to " ?name2 crlf)
)
(defrule O-gives-to-others-but-not-itself ; O to O cover in above rule
(blood-donor (name ?name)(type ?type &:(eq ?type "O")))
(blood-donor (name ?name2)(type ?type2 &: (neq ?type ?type2) &: (neq ?name ?name2) ))
=>
(printout t ?name " can give blood to " ?name2 crlf)
)
(defrule A-or-B-gives-to-AB ; case O gives to AB and AB gives to AB already dealt with
(blood-donor (name ?name)(type ?type &:(or (eq ?type "A") (eq ?type "B" ))))
(blood-donor (name ?name2)(type ?type2 &: (eq ?type2 "AB") &: (neq ?name ?name2) ))
=>
(printout t ?name " can give blood to " ?name2 crlf)
)
;(watch all)
(reset)
(run)