什么是专家系统?
专家系统(Expert System)是一种在特定领域内具有专家水平解决问题能力的程序系统,属于人工智能的一个发展分支。它能够有效地运用专家多年积累的有效经验和专门知识,通过模拟专家的思维过程,解决需要专家才能解决的问题。
专家系统的基本结构如图所示,其中箭头方向为数据流动的方向。专家系统通常由人机交互界面、知识库、推理机、解释器、综合数据库、知识获取等6个部分构成。(来自:MBA智库)
什么是CLIPS?
CLIPS是用于编写专家系统的一种编程语言,或称专家系统工具。CLIPS shell(shell表示该编程环境中代表分析、推理的部分)包含了fact-lists(事实列表)、knowledge-base(知识库)、inference engine(推理机)。
官方文档表示如下:(WPS开护眼,绿光闪耀宁的眼)
本人计划开发一个基于CLIPS的启发式推理的专家系统,数据处理和UI界面将在后期使用Python编写代码实现。在现阶段主要完成逻辑模块,选择CLIPS作为专家系统编程语言,配置相应的编码环境,学习CLIPS6.4的官方文档,并同步做记录于此。
编程环境:CLIPS IDE
害,说是IDE,其实就是界面好看一丢丢的CLIPSDOS,命令提示符为"CLIPS>"。编程过程中没有match快捷方式以及错误提示,不过这样“返璞归真”的编程方式,更有助于提高编程灵敏性吧。除每一条CLIPS语句以及不同关键词都需要由括号包裹这点之外,例如(fact),其他编程思想和数据结构与C和Java或多或少有些相似。
Part One: Facts
fact(事实)是专家系统最基础的一个元素,主要掌握如何声明(assert)、移除(retract)事实即可。
fact 以 assert 生成,retract 删除,<Fact-1>相当于每一条事实的ID,以(facts)查看事实列表的静态数据,(watch facts)动态查看,输入该命令,程序将动态显示列表变动状况。
Part Two: Rule
(说得好哇,寄几创造规则,改变世界啊哈哈)
这一部分,将介绍如何定义Rule规则,在启发式推理当中,基于事实推断出下一步的行动,类似于Java, C 或者Ada语言中的IF THEN。我们先用伪代码(pseudocode)定义一个简单的规则:
IF the animal is a duck THEN the sound made is quack
我们用defrule定义一个rule,类似于函数,往后可以调用它(代码块语言选择里居然没有CLIPS,差评!)
;后的是注释
CLIPS> (assert (animal-is duck)) ;事先声明fact
<Fact-1>
CLIPS> (defrule duck ;duck是规则名
(animal-is duck) ;LHS条件fact
=> ;符合条件后执行下一步
(assert (sound-is quack))) ;RHS执行活动activation
CLIPS> (agenda)
0 duck: f-1 ;默认优先级为0,这个范围是-10000~10000
For a total of 1 activation.
CLIPS> (watch facts)
CLIPS> (watch activations)
CLIPS> (run) ;运行名为duck的rule,符合条件,成功执行活动
==> f-2 (sound-is quack)
CLIPS> (facts)
f-1 (animal-is duck)
f-2 (sound-is quack)
For a total of 2 facts.
CLIPS>
一个简单的逻辑,(animal-is duck)在rule的条件中得到匹配,触发活动(assert (sound-is quack)),也就是声明一个新的fact。在这个简单的程序编写过程中,也遇到了一些小问题,导致rule难以触发,主要原因是rule的LHS(left hand side)条件必须先声明,否则无法匹配。
另外,RHS(right hand side)也可以是输出到屏幕的活动,将=>右侧改为下方命令即可
(printout t "quack" crlf)
"t" 告知CLIPS输出的内容到电脑的standard output device(通常是终端terminal)
实际上,专家系统通常包含成百上千条规则,比如:机器人(人工智能)识别红绿灯时做出判断,需要考虑多种情况,定义rules后声明分别声明(assert)两种条件后运行(run),得到不同输出
CLIPS> (defrule red-light
(light red)
=>
(printout t"Stop!" crlf))
CLIPS> (defrule green-light
(light green)
=>
(printout t"Go!" crlf))
CLIPS> (assert (light green))
<Fact-1>
CLIPS> (run)
Go!
CLIPS> (assert (light red))
<Fact-2>
CLIPS> (run)
Stop!
更具体的说,交通信号灯有更多的标识:车辆左转、右转,行人及非机动车指示灯等,还是机器人的例子,当它在走且指示灯为“走”时,需要在LHS定义两个条件,类似逻辑“and”、“&&”
来源:CSDN
作者:Jariswale
链接:https://blog.csdn.net/Jariswale/article/details/104291931