2016-03-01 27 views
0

我是名为CLIPS的专家系统语言的初学者。我需要编写一个CLIPS脚本来帮助决定,给出有关属性A,B和C(密度,电导率等)的三个事实,即具有这些事实/属性的对象是否属于某种类型,比如TYPE1。我需要编写必要的规则来做出这个决定。感谢您的帮助。CLIPS脚本根据三个事实(属性)对对象进行分类

KB

+1

你到目前为止有什么?我们做家庭作业并不重要,但如果你遇到困难,我们通常可以提供帮助。 –

+0

我知道语法和如何编写规则,但我不知道如何以优雅的方式来完成。例如 – user6004863

+0

我知道语法,可以编写规则,但我不知道如何以优雅的方式来完成。我想使用deftemplate作为:(deftemplate材料(插槽名称)(插槽密度)(插槽电导率)(插槽specific_heat)),然后我可以使用deffacts在系统的“数据库”中创建对象,然后当用户输入3我的规则决定了材料的名称,这听起来是正确的吗?如果是这样,你能否提出我应该写的脚本的“结构”请尽量填写详细信息,谢谢 – user6004863

回答

0

优雅是主观的,但如果你想要的代码是可重复使用和可扩展性,代表了尽可能多的信息,你可以作为数据,这样就可以编写通用的规则。

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> 
+0

我非常感谢EXPERT EXPERT SYSTEMS认真对待我,并花时间回答我的问题,并给我带来了疑问的好处。有时候,第一步是最困难的,最后的帮助是最有价值的。我会查看代码并理解它。非常感谢! – user6004863

相关问题