CLIPS中文手册 联系客服

发布时间 : 星期日 文章CLIPS中文手册更新完毕开始阅读c9b5e41ec5da50e2524d7fe1

第一章 事实

如果你忽视事实,你将永远不会担心自己的过错。

本章将对专家系统的基本概念做简单的介绍。你将会知道在CLIPS中怎样插入和移出事实。如果你正在使用的机器是苹果机或者是IBM(或可兼容)的CLIPS视窗版本,那么你可以通过鼠标来选择相关的命令来代替输入命令行。键盘上的箭头键也可以移动光标对菜单选项进行选择。

序言

CLIPS是一种被用来编写专家系统应用程序的计算机语言。专家系统是一组计算机程序,专门用来模仿人类专家的技能和知识。相比之下,一些普通的程序如报表程序,文本处理器,电子表格,电脑游戏等等,并没有包含人类的技能和知识。(专家的定义之一:就是某人带着他的公文包在离家50公里之外。)

CLIPS之所以被称之为专家系统工具,是因为它是一个开发专家系统的完整环境,包括一个整合版本和一个调试工具。壳这一词被保留在CLIPS负责推理的部分中。CLIPS的壳提供了专家系统的基本元素:

1. 事实表和实例表:数据的全局存储。 2. 数据库:包括所有的规则和规则表。 3. 推理机:控制所有规则的执行。

CLIPS的程序一般包含有规则,事实和对象。推理机决定了哪条规则应该被执行和在什么时候被执行。一个用CLIPS写成的基于规则库的专家系统程序是一个数据-驱动型程序,程序里的事实,对象数据通过推理机的激活执行。

这里有一个例子可以帮助你知道CLIPS是如何与其他程序语言如Java,Ada,BASIC,FORTRAN和C区别开来的。在程序语言中,执行并不一定需要数据,那是因为在那些语言中的声明已经足够引起执行了。举例说明,在BASIC语言中,PRINT 2+2的声明会被立即执行,该声明是一个完整的声明,并不需要额外的数据去驱动执行。然而,在CLIPS中,规则的执行必需数据来驱动。

最初,CLIPS仅有表示规则和事实的能力,然而,在6.0版本中已经允许规则与对象的匹配,与规则与事实匹配一样。同时,通过发送消息来应用对象不必需要规则了,如果你仅仅只是用对象,那么推理机都可以不需要。在第一章到第七章中,我们将讨论CLIPS的事实和规则,八到十二章中包含了CLIPS的对象特点。

开始和结束

你可以在你的系统中输入相应的运行代码来启动CLIPS,你将看到CLIPS的提示如下所示: CLIPS>

此时,你可以开始在CLIPS中直接输入命令,这种直接输入命令的方式被称之为最高阶层。如果你拥有CLIPS的图形界面版本(GUI),你也可以用鼠标选择相应的菜单来代替输入命令行。请参考CLIPS GUI 版本的CLIPS界面向导,探讨一下其里面的命令支持。在本书中,为了简约和一致性,我们假设所有的命令均为输入方式。

离开CLIPS的一般方式是输入exit命令,如下:

(exit)

按照CLIPS提示点击返回键。

建表

与其他编程语言一样,CLIPS也有关键字。举个例子,如果你想在事实表中输入数据,你可以使用assert命令。

作为一个assert实例,在CLIPS提示后面正确输入下面的命令:

CLIPS>(assert (duck)) 这里,assert命令以(duck)作为其参数。记住点击回车键将命令行发送到CLIPS。你将看到如下响应:

这表示CLIPS已经存储了duck的事实,并将其标识为1。在CLIPS中,尖括弧被用来作为条目的分隔符。CLIPS会自动的增加事实的编号,随着一个或更多的事实被添加,从最高事实-索引进行列表。

注意(assert)和它的参数(duck)均用圆括弧括住,像其他一些专家系统语言一样,CLIPS采用LISP式样语法,用圆括弧作为分隔符。虽然CLIPS并不是采用LISP语言编写,但是LISP影响了CLIPS的发展。

检查两遍

假设你想查看一下事实表中的内容,如果你的CLIPS支持GUI,你便可以在菜单中选择相应的命令,或者,你还可以通过键盘键入相应的命令行。接下来,我们将来描述一下键盘命令。

查看事实库的键盘命令是facts命令。在CLIPS提示后输入(facts),CLIPS响应后会将事实表列出。一定记得将命令用圆括弧括住,否则CLIPS会不识别。在该实例中,(facts)命令的句法如下:

CLIPS>(facts)

f-0 (initial-fact) f-1 (duck)

For a total of 2 facts. CLIPS>

f-0和f-1为CLIPS对事实分配的事实标识。每个事实被添加进CLIPS,被分配唯一的事实标识,以“f”开头,后面的数字为事实索引。当启动CLIPS,输入如clear或reset(随后有详细的探讨)后,事实索引将会被归零,然后随着每个事实的添加(assert)逐步加一。(clear)和(reset)命令同时增加一个(initial-fact)事实,编号为f-0。在CLIPS的早期版本中,该事实被CLIPS隐式用来初始化一些规则和被用户显式调用来使事实库初始化,但是现在,该事实仅被用来提供向后兼容性。

如果你将duck在事实表中输入两次,将会出现什么结果呢?让我们试试看,增加一个新事实(duck),然后调用(facts)命令如下所示:

CLIPS>(assert (duck)) FALSE

CLIPS>(facts)

f-0 (initial-fact) f-1 (duck)

For a total of 2 facts. CLIPS>

CLIPS返回FALSE消息,表示不可能执行该条命令,且你将只能见到原始的事实:“f-1 (duck)”。这说明CLIPS不能接受事实的复制输入。然而,CLIPS中还有一个超越命令:set-fact-duplication,该命令允许事实的重复输入。

当然,你可以输入其他不同的事实。举个例子,增加一个(quack)事实,然后运行(facts)命令,如下:

CLIPS>(assert (quack))

CLIPS>(facts)

f-0 (initial-fact) f-1 (duck) f-2 (quack)

For a total of 3 facts. CLIPS>

注意,(quack)事实已经被添加到事实表中了。

事实也会被移出和撤销。当一个事实被撤销,其他的事实索引不会改变,因此会出现事实索引的“丢失”。类似于一个足球运动员离开球队如果没有被补充,其他队员的号码不会因为缺失号码而发生调整(除非他们非常讨厌这个离队的家伙,想要忘掉他曾在队中效力过)。

清除所有事实

Clear命令将所有的事实从内存中移出,代码如下所示:

CLIPS>(facts)

f-0 (initial-fact) f-1 (duck) f-2 (quack)

For a total of 3 facts. CLIPS>(clear) CLIPS>

事实表中的所有事实被清除。

(clear)命令实质上将CLIPS恢复到起始启动状态,它清除了CLIPS的内存空间,重置事实标识为0和增加了一个(initial-fact)事实。增加(animal-is duck)事实,然后查看事实表,会发现(animal-is duck)的事实标识为f-1,这是因为(clear)命令重置了事实表的标识。该命令事实上并不只是起清除所有事实的作用,除此之外,它还清除所有的规则,在下一章中你就会看到。

下面的实例显示了怎样将三个事实加入到事实表,并用(facts)命令查看,然后(clear)命令将这三个事实从内存中清除并重置事实标识为f-0。

CLIPS>(clear)

CLIPS>(assert (a) (b) (c)) CLIPS>(facts)

f-0 (initial-fact) f-1 (a) f-2 (b) f-3 (c)

For a total of 4 facts. CLIPS>(facts 0) f-0 (initial-fact) f-1 (a) f-2 (b) f-3 (c)

For a total of 4 facts. CLIPS>(facts 1) f-1 (a)

f-2 (b) f-3 (c)

For a total of 3 facts. CLIPS>(facts 2) f-2 (b) f-3 (c)

For a total of 2 facts. CLIPS>(facts 1 2) f-0 (initial-fact) f-1 (a) f-2 (b)

For a total of 2 facts. CLIPS>(facts 1 3 2) f-0 (initial-fact) f-1 (a) f-2 (b)

For a total of 2 facts. CLIPS>

注意,仅用一个(assert)便可以增加三个事实:(a),(b)和(c)。最高索引为3,通过CLIPS的信息消息返回。也可以用每个命令增加一个事实的方式(那些这样做的人也许是为了炫耀他们的打字速度)。

注:(facts)命令的完整语法为:(facts [ [ []]]),表示显示索引号大于等于的事实,表示小于等于的事实,表示显示在之间最多个事实。

敏感字段和详解

事实(duck)和(quack)被称之为单字段。一个字段就是一个占位符(命名或未命名),通常拥有一个值。一个简单的类比,你可以将字段想像成一幅画框,这个画框能够装载一幅画,也许画中是你的宠物鸭(也许你会好奇怎样用一幅画表现“quack”,有两个法子:(1)是弄一个示波器来显示一只鸭子说“quack”的波形图,信号的输入来源于一个麦克风;(2)对于那些有科学主义倾向的人,也许还得对“quack”信号做一个傅立叶变换;(3)电视里那些叫卖神奇的祛皱,减肥广告。等等)。只有用deftemplates才叫做占位符,将在第五章中进行详细的介绍。

注:这里的(3)提到的电视广告,意思是电视广告里的广告者会大呼小叫的对他们的产品爆发欢呼,声音像鸭子叫一样,讽刺幽默。

(duck)事实是一个单独,未命名占位符的事实,值为duck。下面有一个关于单字段事实的例子,一个字段即是一个值的占位符。类比想像一下字段,就像碟子(字段)盛食物(值)一样的道理。

未命名字段的顺序非常重要。举例,如果一个事实被定义为:

(Brian duck)

表示一个叫Brian的猎人射杀了一只鸭子,那么事实:

(duck Brian)

则表示鸭子猎手射杀了一个叫Brian的猎人。与之相比,命名字段的顺序是不重要的,稍后你将在deftemplate中看到。

事实上,一个好的软件工程应该采用关系型表示法来表述字段,一个好的事实表示如下: