Agent语言IAPL及其编译器的实现
2020-02-02殷兆燕唐小燕李建新
殷兆燕 唐小燕 李建新
(常州信息职业技术学院 软件与大数据学院 江苏省常州市 213164)
面向Agent 的理论与技术是人工智能研究的重要内容,已取得了一系列的研究成果,如智能Agent 的BDI 理论框架和体系结构、以AGENT-0 为代表的面向Agent 程序设计语言、以KQML 和FIPA ACL 为代表的Agent 通讯语言及其语义和语用等等[1],而面向Agent 的程序设计语言(AOPL)是Agent 理论与技术研究的核心内容[2]。面向Agent 的智能系统与普通软件系统的最显著的差别在于Agent 的行为由其心智状态所决定,而不是由预先设定的程序决定,因此实现Agent 及操纵Agent 所使用的程序设计语言通常不同于传统的程序设计语言。早期Agent 程序设计语言Agent-0[3][4]实现的Agent 包含意向、承诺、能力等,能处理Agent 的某些心智属性,但该语言在形式上做了大量简化。后来研究人员对Agent-0 进行了扩充,在实现Agent 编程时,增加了期望、信念等成份。近年来,又出现了一些新的面向Agent 的程序设计语言,如GOLOG[5]、CONGOLOG[6]、SARL[7]等,实际上这些语言缺乏对Agent 心智状态的表示与处理,还算不上真正的面向人工智能的Agent 语言,且根据这些语言规范实现的Agent 具有较高的计算复杂度,因为它们的刻画工具大都基于多模态逻辑或多模态分支时态逻辑。针对现有Agent 语言的存在不足,笔者提出一种面向智能Agent 程序设计语言IAPL(Intelligent Agent Programming Language)[8],本文在分析IAPL 结构的基础上,根据IAPL 语言形式规范运用JavaCC 实现其编译器。
1 IAPL语言组成结构
IAPL 语言是基于智能Agent 结构AASC[9]的一种面向智能Agent 的程序设计语言,其形式规范详见[8]。IAPL 实现的Agent 结构主要由信念库、规划库、解释器、监控库和行为集五大模块组成,如图1所示。
定义1 Agent ∷=<B,G,S,O,I>,其中,B 表示Agent 的信念库,G 表示Agent 的目标库,S 表示Agent 的策略库,O 表示Agent 的监控库,I 表示Agent 的解释器。
(1)信念库:Agent 对环境状态及其它Agent 的认知和理解知识描述的集合,初始信念以“BELIEFS”标识。信念可执行增删改查等操作。
图1:Agent 结构
图2:.jj 文件结构
图3:IAPLParser 类结构
信念表示形式:关系名 参数1 参数2…参数N;
(2)目标库:Agent 的目标集合,以“GOALS”标识,目标由条件、行为和优先级组成。目标可执行增加和删除操作。
目标表示形式:GOALS:目标类型 目标名 参数1 参数2…参数N<:UTILITY 数学表达式>;
(3)策略库:Agent 为了实现不同的目标而采取的实现方法集合。由策略名、策略要实现的目标、策略执行前提条件和策略体四部分组成,以“STRATEGY”标识。
策略表示形式:
NAME:策略名
GOAL:目标类型 目标名 参数1,参数2,…,参数N;
PRECONDITION:条件表达式;
BODY:策略体;
IAPL 提供OR、DO_ANY、AND、WHILE、PARALLEL 等行为联结符,方便用户实现复杂行为。
图4:Parser.jj 方法说明
图5:JAVA 源程序
策略由行为集中的行为(action)组成。行为有两种类型:
1.内在行为:包括加载、更新查询和删除信念操作;以及基本的逻辑运算、数值运算、字符串运算等;
2.通信行为:包括发送、接收和编译消息的功能,实现与Agent 交互平台的交互。
(4)监控库:实现对外部环境变化的监控,处理接受到的感知信息与通信信息,处理结果将影响信念库中信息的值,其描述方法同上述策略描述,以“OBSERVER”标识。
在IAPL 中,行为分为三类:心智状态操作原语,如信念操作和目标操作、系统内置行为,包括输出、底层通信等、目标行为。
(5)解释器:可视为Agent 的“大脑”,是整个Agent 结构的核心所在,控制Agent 动态运行。
笔者使用ECA 规则来定义Agent 心智状态,如信念和能力等。
定义2 ECA 规则为三元组Reca=<e,C,A>,e 为触发规则的事件;C 为反映系统和环境状态的条件集;A 为行为集。整个规则解释为:若C 条件满足且e 事件发生,则执行A 中所有行为。
复杂的状态可由AND、OR 等基本算子合成得到。Agent 为了实现特定的目标,可执行一系列行为,不同的行为序列可组织成多个不同的活动,一个服务调用对应一个活动。
事实上,Agent 行为的执行依赖于Agent 的信念、目标和对外部环境变化的监控,这种结构的设计类似于人类的思维方式。为了方便用户使用IAPL 语言进行Agent 编程,笔者开发出的原型支撑系统中提供了部分系统开发工具和系统运行环境,其中的解释器用来解释执行IAPL 程序,对接收到的输入信息进行处理,实现外部环境感知和目标执行,执行行为后再影响外部环境及调整自身状态,最终满足用户的需求。
2 基于JavaCC的IAPL编译器实现
JavaCC(Java Compiler Compiler)[10]是一种基于Java 的编译器自动生成器[11],旨在提高基于Java 语言的词法分析器或语法分析器的开发效率,使用它生成的词法分析器为纯Java 代码[12]。用户根据JavaCC 的语法规范编写JavaCC 源文件,使用JavaCC 编译器编译后,就能生成基于Java 语言的IAPL 编译器,执行相应Java 程序,就可完成语言的词法和语法编译功能。
2.1 .jj文件的结构
使用JavaCC 生成编译器的关键是根据语言形式规范,按照JavaCC 的语法写出对应的.jj 文件,作为JavaCC 的输入参数,运行得到Java 主解析文件及其它Java 辅助文件,这样就可在应用程序中调用此主解析文件实现语言的编译功能。
.jj 文件包含四部分:选项、语法分析器类、词法规则及产生式,如图2所示。
(1)任选项(options):若存在,则从保留字“options”声明开始,保留字其后是一个或多个选项绑定值,每个任选项绑定值,说明对应任选项的设置情况,用来声明产生的语法分析器的特性,控制JavaCC 的调试特征等。若不存在,则所有任选项绑定取默认值。
(2)Java 编辑单元(Java_compilation_unit):主要包括类名以及成员的声明。PARSER_BEGIN 和PARSER_END 指定要生成的Java 解析器的名称。其内部可含Java 包声明(package)语句和引用包(import)语句等。此外,还必须定义一个与生成的解析器同名的类。
(3)词法规则(lexical specification):根据不同的编译器生成要求,此部分可忽略。若存在,可为SKIP、TOKEN、SPECIAL_TOKEN、MORE 中任意一个或多个。它们各自对应的含义可参见JavaCC 的语法说明。TOKEN 说明词法标记。SPECIAL_TOKEN说明在解析过程中将被忽略的词法标记,SPECIAL_TOKEN 同于SKIP,但区别在于这些标记可在解析过程中经过适当处理后被恢复。MORE 说明一个部分标记(partial token),一个完整的标记由MORE 序列后跟一TOKEN 或SPECIAL_TOKEN 组成。词法规则用正则表达式(Regular Express ion)来描述。
(4)产生式(production):产生式用来定义语法中的非终端语法元素。每个非终端语法元素对应一Java 方法,编译器通过对应的方法调用来实现对非终端描述的编译。
2.2 IAPLParser.jj文件
就IAPL 而言,在其编译器的实现中,相对应地:
(1)各option 项取值为默认值。
(2)Java 编辑单元中,PARSER_BEGIN 和PARSER_END 指定生成的Java 解析器的名称为IAPLParser,其包含的部分代码如图3所示。
(3)词法说明部分,SKIP、TOKEN、SPECIAL_TOKEN、MORE 分别说明IAPL 形式规范中的对应内容。
(4)产生式部分,形式规范中的每一个语法元素,每个元素对应于Parser.jj 中一个同名的方法,如图4所示。第一个方法为:
2.3 解析器生成
使用JavaCC 命令运行Parser.jj(JavaCC IAPLParser.jj),可以生成特定词法和语法分析器,生成的源程序包含七个Java 源程序,其中前三个是基于IAPL 语法的,其它四个是通用的,起辅助作用的Java 文件。
应用程序可编译这七个Java 源文件,并将它们与应用程序相链接,从而提高效率。将所生成的Java 代码语法分析器主程序中的有关类用“import”命令包含在实现的Java 代码中,就可以方便、高效地实现程序的编译[13]。Agent 解释器在执行程序之前先调用上述生成的解析器对程序进行词法分析。
3 结束语
目前Agent 理论与技术研究核心内容之一便是Agent 程序设计语言。面向Agent 的程序设计语言(AOPL)便于描述和表达Agent的多种拟人的智能特性:自主性、主动性、可动性、反应性、社会性,支持Agent 的感知、识别,推理、决策,动作和行为能力的实现[14]。本文提出的面向智能Agent 程序设计语言IAPL 弥补了现有Agent语言存在的不足,根据其语言形式规范,运用JavaCC 实现其编译器,提高了开发效率。
今后的工作主要有:结合使用JavaCC 及其伙伴工具,如JJDoc 和JJTree 来进一步提高实现IAPL 语言编译器的效率。基于IAPL 开发原型支撑系统,为系统编制Agent 提供支持。