李 丽,王大勇,张 杨,索 菲
(辽宁大学 创新创业学院 辽宁 沈阳 110036)
智能规划是人工智能的一个重要分支,其主要思想是在一定的初始条件下,依据备选动作以及动作或状态的约束进行推理,综合制定出能够实现既定目标的动作序列的过程[1-2].智能规划广泛应用在车间调度、物流管理、智能机器人、航空航天等领域[3-4].美国航空航天局(NASA)的EUROPA系统等多项重大项目中均有应用.
CLIPS语言是人工智能领域的一个经典语言,普遍应用于专家系统[5].CLIPS(C Language Integrated Production System)语言语法简洁、易于操作、性能优异,是广大人工智能研究者青睐的一款语言,分为基于规则的CLIPS、面向对象的CLIPS和面向过程的CLIPS.CLIPS包括事实列表、知识库和推理机三个部分.该语言能够与C、C++等很好的结合,适合编写基于规则框架的软件.规划问题一般利用了前提、效果的规则推导,因此CLIPS语言同样适用在智能规划表示中.
Python语言是目前比较热门的一种编程语言,该语言简单、易于操作,包含众多第三方库,功能强大、应用广泛.目前很多人工智能领域都基于该语言及其第三方库开展科学研究.PyCLIPS库是Python中嵌入的一个功能齐全的CLIPS模块,可以轻松地实现CLIPS与编程语言之间的交互[6-7].PyCLIPS支持面向对象的编程,支持事件触发、事实动态撤销.由于Python和CLIPS都是由C语言编写的,所以能够实现Python与CLIPS的良好交互.
智能规划分为经典规划和非经典规划.经典规划问题是一个三元组P(S,A,γ),其中S是状态的集合,A是动作的集合,γ是状态转换函数.
规划问题常用的定义语言包括STRIPS、ADL、PDDL,其中STRIPS是一种经典的规划语言,很长时间规划系统都是采用STRIPS语言进行描述的,但其也有很多限制条件,比如要求文字是无函数的、时间是离散的、动作的前提和效果必须是合取的.ADL语言对STRIPS语言进行了扩展,取消了一些限制,使得其可以对更多实际问题进行编码.ADL语言包括STRIPS的所有功能,并且还能表达动作的条件效果和量化效果.PDDL语言到目前为止经历了PDDL1.2、PDDL2.1、PDDL+、PPDDL1.0、PDDL3.0、PDDL4J[8]等多个版本.PDDL4J是一个面向Java跨平台开发的开源工具包.很多的规划器都是基于Linux系统开发的.
基于规则的CLIPS语言是一种多范例编程语言,支持正向链规则,不支持反向链规则,不同环境下格式也会有所不同.CLIPS包含三种基本元素,分别为简单数据类型、控制数据的函数和添加知识的结构.CLIPS中提供了8种简单数据类型,能够完成不同任务的需求.
CLIPS提供三种知识表示方式,分别为规则、函数和对象.规则是基于启发式经验知识库的首要选择.函数包括自定义函数和通用函数.函数与面向对象设计都是程序式知识表示的首选.
启发式规则为特定场景定义了一系列出发动作.设计者定义一系列规则,这些规则将协同解决一个实际问题.规则由前件和后件组成.前件由一系列条件组成,这些条件必须全部满足,该条规则才能被触发.这种由前件推导出后件的模式恰好与智能规划的推导方式一致,如图1、图2所示.
assert命令会将一个或多个事实添加到事实列表中,因此用其定义智能规划中的添加效果,其语法规则如下:
(assert(<事实名1>)(<事实名2>)…(<事实名n>)).
与assert对应的命令为retract,retract命令会将一个或多个事实从事实列表中删除,因此用其定义智能规划中的删除效果,retract的语法规则如下:
(retract <事实索引1><事实索引2>…<事实索引n>).
这类事实的定义可以借助CLIPS语言中的deftemplate和deffacts来描述.deftemplate用来定义状态结构,deffacts用来定义智能规划中的初始状态和目标状态.它们的一般格式为
(deftemplate<状态结构名> [<可选注释>]
<槽定义>*),
(deffacts<状态名>[<可选注释>]
<事实>*).
CLIPS语言用defrule定义规则,智能规划中可以用defrule定义动作,defrule的一般格式为
(defrule<动作名>[<注释>]
<前提>*;前件
=>
<添加效果/删除效果>*;后件.
利用上述命令,以经典规划中的图规划为例,对于积木世界问题进行表示,选取初始状态和目标状态如图3所示.
图规划的是智能规划的一个重要分支,图规划问题是一个四元组φ(A,O,I,G),其中A是操作的集合,O是对象的集合,I是初始状态的集合,G是目标状态的集合[9-10].
利用图规划对这一问题进行扩张与解搜索,如图4所示.
图中时间步1的命题列为初始状态,经过时间步1的动作列、时间步2的命题列和动作列,到达时间步3的命题列,即目标状态.经过解搜索得到规划解的动作集为{(put B C)(put A B)}.
这一过程采用CLIPS语言描述,可以利用assert、retract、deftemplate、deffacts、defrule等命令完成.
用事实描述正在被处理的积木的目标,这些目标可以用自定义模板来描述.deffacts自定义事实结构特别适合程序运行前已知知识的定义,因此用其定义规划的初始条件.同理,也可以用deffacts定义规划的目标.具体实例如下:
(deftemplate goal
(slot on(type STRING))
(slot noting(type STRING)))
(deftemplate initial-state
(slot block(type STRING))
(slot on(type STRING))
(slot noting(type STRING)))
目标和初始状态的实例如下:
(deffacts goal
(on A B)
(on B C)
(on C T)
(nothing A))
(deffacts initial-state
(block A)
(block B)
(block C)
(on A T)
(on B T)
(on C T)
(noting A)
(noting B)
(noting C))
利用defrule命令定义规则put-on,该规则能够将一个积木搭建在另一块积木上,规则定义如下所示.
(defrule put-on
?goal<-(goal(on ?block1 ?block2))
(block ?block1)
(block ?block2)
(nothing ?block1)
(nothing ?block2)
?t<-(nothing ?block2)
=>
(assert(on ?block1 ?block2)
(retract ?t))
实例推导过程:
(defrule put-on
?goal<-(goal(on B C))
(block B)
(block C)
(nothing B)
(nothing C)
?t<-(nothing C)
=>
(assert(on B C)
(retract ?t))
(defrule put-on
?goal<-(goal(on A B))
(block A)
(block B)
(nothing A)
(nothing B)
?t<-(nothing B)
=>
(assert(on A B)
(retract ?t))
CLIPS语言有自带的开发工具,目前最新版本为CLIPS 6.4.系统开发时需要将CLIPS嵌入到高级语言中,主要方法为直接嵌入方式和动态链接库嵌入方式,两种方式都存在不同程度的实现繁琐、通用性差等缺点.PyCLIPS可以实现CLIPS的所有功能,是Python语言的第三方库.在使用时只需要遵循Python常规方式先行导入clips库,在Python语言中就可以轻松调用CLIPS的功能.CLIPS与PyCLIPS常用功能对照如表1所示.
表1 CLIPS与PyCLIPS功能对照表
程序中部分PyCLIPS语句如下:
>>> import clips
>>>clips.Reset()
>>> t0=clips.BuildTemplate(“goal”,″″″
(slot on (type STRING))
(slotnoting (type STRING))
″″″)
>>>f1=clips.Fact(t0)
……
>>>r1=clips.BuildRule(“put-on”,″″″
?goal<-(goal (on ?block1 ?block2))
(block ?block1)
(block ?block2)
(nothing ?block1)
(nothing ?block2)
?t<-(nothing ?block2)
=>
(assert (on ?block1 ?block2)
(retract ?t))″″″)
本文研究了基于CLIPS语言的智能规划表示方法.利用CLIPS语言的事实和规则等概念,描述智能规划中的对象、事实、状态和操作.CLIPS方法是经典的人工智能表示语言,结合Python语言及其第三方库更易于应用在不同情况的处理.当然,相比STRIPS、ADL和PDDL语言,CLIPS语言不是专门的规划语言,描述规划问题时会有所局限.