专家系统 - CLIPS语言学习(1)fact & rule

拜拜、爱过 提交于 2020-02-14 08:41:55

什么是专家系统?

专家系统(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”、“&&”

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!