每一个产生式系统都必须有一种或者几种相应的语言用来描述产生式, CLIPS 是一种用于专家系统的计算机语言, 该语言能够描述规则、自定义函数和泛型函数、面向对象编程三种知识。
在CLIPS语言中,deftemplate关键字类似于Pascal中的记录结构,也就是说deftemplate以一种类似于Pascal定义记录的方式定义了一组相关的字段。这些字段在CLIPS中用slot关键字表示。举例来说:
- (deftemplate LinkError
- (slot computer_name (type STRING))
- (slot ipaddress (type STRING))
- (slot usr_name (type STRING))
- (slot dest_ipaddress (type STRING))
- )
定义了一个链接错误,该链接错误有三个属性,computer_name指定了发起链接的计算机名,ipaddress指定了发起链接的计算机地址,usr_name指定了发起链接的计算机用户名,dest_ipaddress指定了所要链接的目标计算机ip地址。
defrule是CLIPS语言中定义规则的关键字,举例来说:
- (defrule find_unaccessable_host ;规则头
- (LinkError
- ( dest_ipaddress ?dest_variable ) ;
- ( dest_ipaddress ?source_variable ) ;
- )
- (LinkError
- ( dest_ipaddress ?dest_variable ) ;
- ( dest_ipaddress ~?source_variable ) ;
- )
- => (printout t "the computer whose ip address is" ?dest_variable "has fault")
- )
该规则的目的是找到不能够访问的主机,主机A连接B时,产生LinkError定义的事件实例e1;主机C链接B时,产生LinkError定义的事件实例e2;如果两个事件都发生,那么根本原因可能是:IP地址为BIP(B主机的IP)的主机链接故障;则将该故障做为一个可能的故障假设。在该规则中dest_variable是CLIPS语言定义的变量,用于连接两个事件实例。
以上是利用CLIPS语言描述规则的情况,这里举出两个规则信息,然后给出其对应的鉴别网络图。
规则1:
(defrule joinConversion1(EventOne(intAttr ?intA))(EventTwo(strAttr ?intB&:(> ?intA ?intB))(shortAttr 100))=>(printout t "joinConversion1 fired and there may be an fault in the harddisk." crlf))
规则2:
(defrule joinConversion2(EventOne(intAttr ?intA))(EventTwo(strAttr ~?intA)(shortAttr 101))=>(printout t "joinConversion2 fired and int to string eval was good" crlf))
生成的鉴别网络如图所示: