没有合适的资源?快使用搜索试试~ 我知道了~
首页CLIPS专家系统编程入门:事实与推理机解析
"CLIPS中文手册.pdf" CLIPS是一款用于构建专家系统应用程序的计算机语言环境,其设计目的是模仿人类专家的专业技能和知识。专家系统是由计算机程序组成的,它们并不像普通程序(如报表程序、文本处理器等)那样仅执行预定义的任务,而是能够依据内置的规则和知识库进行推理和决策。 在CLIPS中,有两个关键概念——事实和实例表。事实是专家系统中的数据元素,代表已知的信息,可以被插入或删除。实例表则用于存储特定类型的对象实例。这些数据全局存储在CLIPS的数据库中,包括所有规则和规则表。CLIPS的"壳"部分包含了推理机,它是专家系统的核心,负责决定何时以及哪些规则应当被执行。 CLIPS程序由规则、事实和对象组成。规则是条件-行动对,只有当条件满足时才会触发行动。事实驱动推理机的执行,即只有在存在适当的事实数据时,规则才会被激活并执行。不同于其他编程语言(如Java、Ada、BASIC、FORTRAN和C),CLIPS的执行依赖于数据的存在,而不仅仅是语句的声明。 CLIPS的6.0版本引入了对象特性,使得规则不仅可以与事实匹配,还可以与对象匹配。对象可以发送和接收消息,这使得CLIPS的灵活性大大增强,即使不涉及规则,也能通过对象间的交互实现复杂逻辑。前七章的文档主要讲解事实和规则,后五章则深入探讨CLIPS的对象功能。 启动CLIPS环境后,用户会在命令行看到"CLIPS>"提示符,此时可以直接输入命令或定义规则和事实,开始构建和测试专家系统。CLIPS提供了一个集成的开发和调试环境,使得用户能够方便地创建、测试和调试专家系统应用程序,从而模拟专业领域的决策过程。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/12484808/bgb.jpg)
下面是采用 CLIPS语法将上面的伪代码写成一个事实和一个命名为 duck 的事实。规则名紧跟在
关键字 defrule 后面。虽然你可以将规则都写在一行里面, 但是我们通常将规则分成几段放在几行里
书写,便于程序的阅读和编辑。
CLIPS>(unwatch facts)
CLIPS>(clear)
CLIPS>(assert (animal-is duck))
<Fact-1>
CLIPS>(defrule duck
(animal-is duck)
=>
(assert (sound-is quack)))
CLIPS>
如果你按照上面正确的输入, 你便会看到 CLIPS的提示符出现, 否则,你将会看到一个错误消息
提示。如果你得到一个错误消息,也许是你拼错了关键字或你遗漏了圆括号。记住,在一个声明中,
圆括弧的左边和右边部分的数目是配套的。
下面将给出一个相同的规则, 该规则中增加了对规则每部分的注释。 同时也增加了可选的规则头
(rule-header) 注释:“ Here comes the quack ”。规则中只能包含一个规则头注释,且必须写在规
则名之后和第一个模式 (pattern)之前。虽然现在我们只是讨论基于事实的模式匹配,一般来说,模式
的匹配时基于模式实体上 (pattern entity)的。模式实体是一个事实,也可以是一个用户定义类的实例。
基于对象的模式匹配将稍后讨论。
CLIPS基于模式实体来进行模式匹配。当然,由空格,制表和回车组成的空格将规则的几个部分
分隔开来,以增强可读性。其他的注释由分号引导,直到按下回车键结束一行。 CLIPS忽略注释里的
内容。
(defrule duck “Here comes the quack ” ; 规则头
(animal-is duck) ; 模式
=> ; THEN 箭头
(assert (sound-is quack))) ; 执行
CLIPS中,同时刻只能仅有一个规则名存在。
输入同一个规则名,如本例中的“ duck”,将会更替前面规则名为“ duck”里已经存在的一切。
也就是说, CLIPS中可能有许多条规则,但是只能有一条被命名为“ duck”的规则。这与其他程序语
言中一个程序名只能标识唯一程序段是一样的道理。
规则的常规语法如下所示:
(defrule rule_name “optinal_comment ”
(pattern_1) ; 由一些在“ =>”之前的元素组成的规则左部分
(pattern_2)
.
.
.
(pattern_N)
=>
(action_1) ; 由一些在“ =>”之后的元素组成的规则右部分
(action_2)
.
.
.
![](https://csdnimg.cn/release/download_crawler_static/12484808/bgc.jpg)
(action_M)) ; 最后一个“ ) ”是与“ defrule ”前面的“ ) ”配
; 套的。保证你的圆括弧完整,否则你将得到错误
; 消息提示
整个规则必须用圆括弧括住,每个模式 (pattern) 和每个行为 (action) 都必须用圆括弧括住。行
为通常是一类没有返回值 (return value) 的函数,但是它可以完成一些有用的执行,如 (assert) 和
(retract) 。举个例子,一个行为可以是 (assert (duck)) 。这里的函数名是“ assert ”,它的参数是
“duck”。注意,我们并没有希望得到一个如数字型的返回值,而是使得事实 (duck) 被增加到 CLIPS
中去。 CLIPS中的函数 (function) 是一段可执行代码,该段代码被特定的函数名标识,返回有用的值
或产生有用的副作用,如 (printout) 。
一个规则通常包含有多个模式和行为。 模式和行为的数量并不一定得相等, 这就是上面例子中用
N和 M来代指的意义。
零个或多个模式写在规则名之后。每个模式包含一个或多个字段。在上面的 duck 规则中,模式
为(animal-is duck) ,字段为“ animal-is ”和“ duck”。 CLIPS试图将模式与事实表中的事实进行
匹配,如果规则的模式与事实匹配成功,规则将会被激活 (activated) 而放入到议程 (agenda) 中。议
程中存放的是所有被激活的规则集合。议程中通常包含零个或多个激活的规则。
规则中,模式后面的符号“ =>”被称之为箭号 (arrow) ,箭号是 IF-THEN规则的 THEN部分开始的
标记(也许可以被读作“意味着”)。
规则的最后部分为零个或多个行为, 当规则被触发 (fire) 时,这些行为将会被执行。 在我们的实
例中,行为是增加一个事实 (sound-is quack) 。Fire 一词意味着 CLIPS已经选定了议程中某条规则
并执行。
当议程中没有激活的规则时,程序停止执行。
当议程中有多条激活规则时, CLIPS自动决定哪条规则将被合理的触发。 CLIPS依照增加优先权
和特权 (salience) 来对议程的激活排序。
规则中箭号之前的被称之为左部 (LHS),箭号之后的部分被称之为右部 (RHS)。如果没有指定模式,
则 CLIPS会在输入 (reset) 命令后自动的激活该条规则。
让鸭子叫吧
CLIPS通常会执行议程中最高优先权规则右部的行为部分。随后该条规则将会被移出议程,接下
来最高特权规则的行为将会被执行。 这样持续执行下去, 直到议程中没有激活的规则或输入了停止激
活的命令为止。
你可以通过议程 (agenda) 命令来查看议程中的内容,举例说明:
CLIPS>(agenda)
0 duck: f-1
For a total of 1 activation.
CLIPS>
第一个数字“ 0”表示规则“ duck”的激活特权值,“ f-1 ”为事实的标识, (animal-is duck)
为匹配激活。如果没有显式的声明特权值,则 CLIPS默认为 0。特权值的范围为 -10000 到 10000。本
书中,我们将用 default 的定义来作为标准方式。
如果议程中仅有一个规则,该规则将被触发。前面知道了 duck-sound 规则的模式左部为:
(animal-is duck)
该模式刚好与 (animal-is duck) 事实符合,因此 duck-sound 规则将会被触发。
模式的字段被称之为字面约束 (literal constraint) 。之所以称之为字面意味着有一个常数值,
与之对立的是值可以改变的变量。在此例中,字面为“ animal-is ”和“ duck”。
输入 run 命令即可使程序运行。 敲入 (run) 并回车,然后输入 (facts) 命令查看通过该规则有哪些
事实被添加。
![](https://csdnimg.cn/release/download_crawler_static/12484808/bgd.jpg)
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)
剩余63页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
lwlgzy
- 粉丝: 109
- 资源: 11
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 计算机人脸表情动画技术发展综述
- 关系数据库的关键字搜索技术综述:模型、架构与未来趋势
- 迭代自适应逆滤波在语音情感识别中的应用
- 概念知识树在旅游领域智能分析中的应用
- 构建is-a层次与OWL本体集成:理论与算法
- 基于语义元的相似度计算方法研究:改进与有效性验证
- 网格梯度多密度聚类算法:去噪与高效聚类
- 网格服务工作流动态调度算法PGSWA研究
- 突发事件连锁反应网络模型与应急预警分析
- BA网络上的病毒营销与网站推广仿真研究
- 离散HSMM故障预测模型:有效提升系统状态预测
- 煤矿安全评价:信息融合与可拓理论的应用
- 多维度Petri网工作流模型MD_WFN:统一建模与应用研究
- 面向过程追踪的知识安全描述方法
- 基于收益的软件过程资源调度优化策略
- 多核环境下基于数据流Java的Web服务器优化实现提升性能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)