CLIPS>(run) CLIPS>(facts)
f-0 (initial-fact) f-1 (animal-is duck) f-2 (sound-is quack) For a total of 3 facts. CLIPS>
在操作之前,让我们使用save命令来保存duck规则,这样你就可以避免重复输入了(如果你还没有将这些保存到编辑器中)。输入命令如下:
(save “duck.clp”)
将CLIPS内存中的规则保存到命名为“duck.clp”的文件中,“.clp”是一个简单方便的扩展名,让我们方便知道这是一个CLIPS的源文件。注意,从CLIPS内存中保存下的代码只保留了双引号内可选规则头的注释,而分号后的注释就没有了。
踢你的鸭子
也许此时你会有一个有趣的问题,如果重复执行(run),结果会这样?当一个规则被事实满足时,该规则会被触发,然而,如果你重复执行(run),你会发现该条规则不将被触发了。这也许让人有一点沮丧,然而,在你做出一些极端的减轻沮丧的事情之前---如狠踢你的宠物鸭---你得多了解一些专家系统的基本原理。
当规则的模式与下面的几点匹配时,规则被激活: 1. 之前不存在的不同的新的模式实体
2. 该模式实体存在,但是被撤销或者被重新添加了。举个例子,旧模式实体的副本便是一个新的模式实体。
规则和匹配的模式目录,都是被激活的。如果是规则或模式实体,或者同时被改变了,激活将会被移除。一个激活的也可以通过命令或另一规则的行为被移除,该规则在移除激活的先决条件前被触发。
推理机通过特权值将激活进行分类。这种分类过程被称之为冲突消解(conflict resolution),因为它消解了决定下一个触发规则的冲突。CLIPS依照议程中最高的特权值进行规则的激活,并移除激活。这种执行被称之为触发,就像神经细胞的激活。当有适当的刺激时,神经细胞会激发出一定的电压脉冲,神经细胞激活后,将遭受折射(refraction)并在一定时期内不能被再次触发。如果没有折射,神经细胞将会在刺激作用下无休止的被激活下去。
如果没有折射效应,专家系统将会经常陷入到无关重要的循环当中去。因为,一旦规则被触发,那么它将在相同的事实作用下无休止的被触发下去。在现实世界中,引起触发的刺激最终都会消失。举个例子,一只真的鸭子也许会游走或在电影里充当一个角色,然而,在计算机世界里,一旦数据被存储,它将一直保存在那儿,除非有外部声明移除或电脑断电。
下面的例子展示了一个规则的激活和触发。注意(watch)命令被用来更好的显示每个事实和激活。右箭号表明激活和事实正在被添加,左箭号表明已存在的事实和激活。
CLIPS>(clear)
CLIPS>(defrule duck
(animal-is duck) =>
(assert (sound-is quack))) CLIPS>(watch facts)
CLIPS>(watch activations)
CLIPS>(assert (animal-is duck)) ==>f-1 (animal-is duck)
==>Activation 0 duck:f-1 ; 激活的默认权值为0,其后是规则名:模式
CLIPS>(assert (animal-is duck)) ; 注意复制的事实不会被输入 FALSE
CLIPS>(agenda) 0 duck: f-1
For a total of 1 activation. CLIPS>(run)
==>f-2 (sound-is quack) </