0
我是名为CLIPS的专家系统语言的初学者。我需要编写一个CLIPS脚本来帮助决定,给出有关属性A,B和C(密度,电导率等)的三个事实,即具有这些事实/属性的对象是否属于某种类型,比如TYPE1。我需要编写必要的规则来做出这个决定。感谢您的帮助。CLIPS脚本根据三个事实(属性)对对象进行分类
KB
我是名为CLIPS的专家系统语言的初学者。我需要编写一个CLIPS脚本来帮助决定,给出有关属性A,B和C(密度,电导率等)的三个事实,即具有这些事实/属性的对象是否属于某种类型,比如TYPE1。我需要编写必要的规则来做出这个决定。感谢您的帮助。CLIPS脚本根据三个事实(属性)对对象进行分类
KB
优雅是主观的,但如果你想要的代码是可重复使用和可扩展性,代表了尽可能多的信息,你可以作为数据,这样就可以编写通用的规则。
CLIPS>
(deftemplate obj
(slot obj-name)
(slot print-name))
CLIPS>
(deftemplate opv
(slot obj-name)
(slot prop)
(slot val))
CLIPS>
(deftemplate type
(slot type-name)
(slot print-name))
CLIPS>
(deftemplate type-prop
(slot type-name)
(slot prop-name)
(slot prop-test)
(multislot values))
CLIPS>
(defrule is-type
?o <- (obj (obj-name ?obj-name))
?t <- (type (type-name ?type-name))
(forall (type-prop (type-name ?type-name)
(prop-name ?prop-name)
(prop-test ?prop-test)
(values $?values))
(opv (obj-name ?obj-name)
(prop ?prop-name)
(val ?val))
(test (funcall ?prop-test ?val (expand$ ?values))))
=>
(printout t (fact-slot-value ?o print-name)
" is "
(fact-slot-value ?t print-name)
crlf))
CLIPS>
(deffacts objects
(obj (obj-name thing1) (print-name "Thing 1"))
(opv (obj-name thing1) (prop color) (val red))
(opv (obj-name thing1) (prop weight) (val 5))
(obj (obj-name thing2) (print-name "Thing 2"))
(opv (obj-name thing2) (prop color) (val blue))
(opv (obj-name thing2) (prop weight) (val 20))
(obj (obj-name thing3) (print-name "Thing 3"))
(opv (obj-name thing3) (prop color) (val white))
(opv (obj-name thing3) (prop weight) (val 10)))
CLIPS>
(deffacts types
(type (type-name light) (print-name "light"))
(type-prop (type-name light) (prop-name weight) (prop-test <=) (values 5))
(type (type-name heavy) (print-name "heavy"))
(type-prop (type-name heavy) (prop-name weight) (prop-test >=) (values 20))
(type (type-name just-right) (print-name "just right"))
(type-prop (type-name just-right) (prop-name weight) (prop-test >=) (values 20))
(type-prop (type-name just-right) (prop-name color) (prop-test one-of) (values red green blue)))
CLIPS>
(deffunction one-of (?val $?rest)
(member$ ?val ?rest))
CLIPS> (reset)
CLIPS> (run)
Thing 2 is just right
Thing 2 is heavy
Thing 1 is light
CLIPS>
我非常感谢EXPERT EXPERT SYSTEMS认真对待我,并花时间回答我的问题,并给我带来了疑问的好处。有时候,第一步是最困难的,最后的帮助是最有价值的。我会查看代码并理解它。非常感谢! – user6004863
你到目前为止有什么?我们做家庭作业并不重要,但如果你遇到困难,我们通常可以提供帮助。 –
我知道语法和如何编写规则,但我不知道如何以优雅的方式来完成。例如 – user6004863
我知道语法,可以编写规则,但我不知道如何以优雅的方式来完成。我想使用deftemplate作为:(deftemplate材料(插槽名称)(插槽密度)(插槽电导率)(插槽specific_heat)),然后我可以使用deffacts在系统的“数据库”中创建对象,然后当用户输入3我的规则决定了材料的名称,这听起来是正确的吗?如果是这样,你能否提出我应该写的脚本的“结构”请尽量填写详细信息,谢谢 – user6004863