殷兆燕 唐小燕 李建新
(常州信息職業(yè)技術(shù)學(xué)院 軟件與大數(shù)據(jù)學(xué)院 江蘇省常州市 213164)
面向Agent 的理論與技術(shù)是人工智能研究的重要內(nèi)容,已取得了一系列的研究成果,如智能Agent 的BDI 理論框架和體系結(jié)構(gòu)、以AGENT-0 為代表的面向Agent 程序設(shè)計(jì)語(yǔ)言、以KQML 和FIPA ACL 為代表的Agent 通訊語(yǔ)言及其語(yǔ)義和語(yǔ)用等等[1],而面向Agent 的程序設(shè)計(jì)語(yǔ)言(AOPL)是Agent 理論與技術(shù)研究的核心內(nèi)容[2]。面向Agent 的智能系統(tǒng)與普通軟件系統(tǒng)的最顯著的差別在于Agent 的行為由其心智狀態(tài)所決定,而不是由預(yù)先設(shè)定的程序決定,因此實(shí)現(xiàn)Agent 及操縱Agent 所使用的程序設(shè)計(jì)語(yǔ)言通常不同于傳統(tǒng)的程序設(shè)計(jì)語(yǔ)言。早期Agent 程序設(shè)計(jì)語(yǔ)言Agent-0[3][4]實(shí)現(xiàn)的Agent 包含意向、承諾、能力等,能處理Agent 的某些心智屬性,但該語(yǔ)言在形式上做了大量簡(jiǎn)化。后來(lái)研究人員對(duì)Agent-0 進(jìn)行了擴(kuò)充,在實(shí)現(xiàn)Agent 編程時(shí),增加了期望、信念等成份。近年來(lái),又出現(xiàn)了一些新的面向Agent 的程序設(shè)計(jì)語(yǔ)言,如GOLOG[5]、CONGOLOG[6]、SARL[7]等,實(shí)際上這些語(yǔ)言缺乏對(duì)Agent 心智狀態(tài)的表示與處理,還算不上真正的面向人工智能的Agent 語(yǔ)言,且根據(jù)這些語(yǔ)言規(guī)范實(shí)現(xiàn)的Agent 具有較高的計(jì)算復(fù)雜度,因?yàn)樗鼈兊目坍?huà)工具大都基于多模態(tài)邏輯或多模態(tài)分支時(shí)態(tài)邏輯。針對(duì)現(xiàn)有Agent 語(yǔ)言的存在不足,筆者提出一種面向智能Agent 程序設(shè)計(jì)語(yǔ)言IAPL(Intelligent Agent Programming Language)[8],本文在分析IAPL 結(jié)構(gòu)的基礎(chǔ)上,根據(jù)IAPL 語(yǔ)言形式規(guī)范運(yùn)用JavaCC 實(shí)現(xiàn)其編譯器。
IAPL 語(yǔ)言是基于智能Agent 結(jié)構(gòu)AASC[9]的一種面向智能Agent 的程序設(shè)計(jì)語(yǔ)言,其形式規(guī)范詳見(jiàn)[8]。IAPL 實(shí)現(xiàn)的Agent 結(jié)構(gòu)主要由信念庫(kù)、規(guī)劃庫(kù)、解釋器、監(jiān)控庫(kù)和行為集五大模塊組成,如圖1所示。
定義1 Agent ∷=<B,G,S,O,I>,其中,B 表示Agent 的信念庫(kù),G 表示Agent 的目標(biāo)庫(kù),S 表示Agent 的策略庫(kù),O 表示Agent 的監(jiān)控庫(kù),I 表示Agent 的解釋器。
(1)信念庫(kù):Agent 對(duì)環(huán)境狀態(tài)及其它Agent 的認(rèn)知和理解知識(shí)描述的集合,初始信念以“BELIEFS”標(biāo)識(shí)。信念可執(zhí)行增刪改查等操作。
圖1:Agent 結(jié)構(gòu)
圖2:.jj 文件結(jié)構(gòu)
圖3:IAPLParser 類(lèi)結(jié)構(gòu)
信念表示形式:關(guān)系名 參數(shù)1 參數(shù)2…參數(shù)N;
(2)目標(biāo)庫(kù):Agent 的目標(biāo)集合,以“GOALS”標(biāo)識(shí),目標(biāo)由條件、行為和優(yōu)先級(jí)組成。目標(biāo)可執(zhí)行增加和刪除操作。
目標(biāo)表示形式:GOALS:目標(biāo)類(lèi)型 目標(biāo)名 參數(shù)1 參數(shù)2…參數(shù)N<:UTILITY 數(shù)學(xué)表達(dá)式>;
(3)策略庫(kù):Agent 為了實(shí)現(xiàn)不同的目標(biāo)而采取的實(shí)現(xiàn)方法集合。由策略名、策略要實(shí)現(xiàn)的目標(biāo)、策略執(zhí)行前提條件和策略體四部分組成,以“STRATEGY”標(biāo)識(shí)。
策略表示形式:
NAME:策略名
GOAL:目標(biāo)類(lèi)型 目標(biāo)名 參數(shù)1,參數(shù)2,…,參數(shù)N;
PRECONDITION:條件表達(dá)式;
BODY:策略體;
IAPL 提供OR、DO_ANY、AND、WHILE、PARALLEL 等行為聯(lián)結(jié)符,方便用戶實(shí)現(xiàn)復(fù)雜行為。
圖4:Parser.jj 方法說(shuō)明
圖5:JAVA 源程序
策略由行為集中的行為(action)組成。行為有兩種類(lèi)型:
1.內(nèi)在行為:包括加載、更新查詢和刪除信念操作;以及基本的邏輯運(yùn)算、數(shù)值運(yùn)算、字符串運(yùn)算等;
2.通信行為:包括發(fā)送、接收和編譯消息的功能,實(shí)現(xiàn)與Agent 交互平臺(tái)的交互。
(4)監(jiān)控庫(kù):實(shí)現(xiàn)對(duì)外部環(huán)境變化的監(jiān)控,處理接受到的感知信息與通信信息,處理結(jié)果將影響信念庫(kù)中信息的值,其描述方法同上述策略描述,以“OBSERVER”標(biāo)識(shí)。
在IAPL 中,行為分為三類(lèi):心智狀態(tài)操作原語(yǔ),如信念操作和目標(biāo)操作、系統(tǒng)內(nèi)置行為,包括輸出、底層通信等、目標(biāo)行為。
(5)解釋器:可視為Agent 的“大腦”,是整個(gè)Agent 結(jié)構(gòu)的核心所在,控制Agent 動(dòng)態(tài)運(yùn)行。
筆者使用ECA 規(guī)則來(lái)定義Agent 心智狀態(tài),如信念和能力等。
定義2 ECA 規(guī)則為三元組Reca=<e,C,A>,e 為觸發(fā)規(guī)則的事件;C 為反映系統(tǒng)和環(huán)境狀態(tài)的條件集;A 為行為集。整個(gè)規(guī)則解釋為:若C 條件滿足且e 事件發(fā)生,則執(zhí)行A 中所有行為。
復(fù)雜的狀態(tài)可由AND、OR 等基本算子合成得到。Agent 為了實(shí)現(xiàn)特定的目標(biāo),可執(zhí)行一系列行為,不同的行為序列可組織成多個(gè)不同的活動(dòng),一個(gè)服務(wù)調(diào)用對(duì)應(yīng)一個(gè)活動(dòng)。
事實(shí)上,Agent 行為的執(zhí)行依賴于Agent 的信念、目標(biāo)和對(duì)外部環(huán)境變化的監(jiān)控,這種結(jié)構(gòu)的設(shè)計(jì)類(lèi)似于人類(lèi)的思維方式。為了方便用戶使用IAPL 語(yǔ)言進(jìn)行Agent 編程,筆者開(kāi)發(fā)出的原型支撐系統(tǒng)中提供了部分系統(tǒng)開(kāi)發(fā)工具和系統(tǒng)運(yùn)行環(huán)境,其中的解釋器用來(lái)解釋執(zhí)行IAPL 程序,對(duì)接收到的輸入信息進(jìn)行處理,實(shí)現(xiàn)外部環(huán)境感知和目標(biāo)執(zhí)行,執(zhí)行行為后再影響外部環(huán)境及調(diào)整自身狀態(tài),最終滿足用戶的需求。
JavaCC(Java Compiler Compiler)[10]是一種基于Java 的編譯器自動(dòng)生成器[11],旨在提高基于Java 語(yǔ)言的詞法分析器或語(yǔ)法分析器的開(kāi)發(fā)效率,使用它生成的詞法分析器為純Java 代碼[12]。用戶根據(jù)JavaCC 的語(yǔ)法規(guī)范編寫(xiě)JavaCC 源文件,使用JavaCC 編譯器編譯后,就能生成基于Java 語(yǔ)言的IAPL 編譯器,執(zhí)行相應(yīng)Java 程序,就可完成語(yǔ)言的詞法和語(yǔ)法編譯功能。
使用JavaCC 生成編譯器的關(guān)鍵是根據(jù)語(yǔ)言形式規(guī)范,按照J(rèn)avaCC 的語(yǔ)法寫(xiě)出對(duì)應(yīng)的.jj 文件,作為JavaCC 的輸入?yún)?shù),運(yùn)行得到Java 主解析文件及其它Java 輔助文件,這樣就可在應(yīng)用程序中調(diào)用此主解析文件實(shí)現(xiàn)語(yǔ)言的編譯功能。
.jj 文件包含四部分:選項(xiàng)、語(yǔ)法分析器類(lèi)、詞法規(guī)則及產(chǎn)生式,如圖2所示。
(1)任選項(xiàng)(options):若存在,則從保留字“options”聲明開(kāi)始,保留字其后是一個(gè)或多個(gè)選項(xiàng)綁定值,每個(gè)任選項(xiàng)綁定值,說(shuō)明對(duì)應(yīng)任選項(xiàng)的設(shè)置情況,用來(lái)聲明產(chǎn)生的語(yǔ)法分析器的特性,控制JavaCC 的調(diào)試特征等。若不存在,則所有任選項(xiàng)綁定取默認(rèn)值。
(2)Java 編輯單元(Java_compilation_unit):主要包括類(lèi)名以及成員的聲明。PARSER_BEGIN 和PARSER_END 指定要生成的Java 解析器的名稱。其內(nèi)部可含Java 包聲明(package)語(yǔ)句和引用包(import)語(yǔ)句等。此外,還必須定義一個(gè)與生成的解析器同名的類(lèi)。
(3)詞法規(guī)則(lexical specification):根據(jù)不同的編譯器生成要求,此部分可忽略。若存在,可為SKIP、TOKEN、SPECIAL_TOKEN、MORE 中任意一個(gè)或多個(gè)。它們各自對(duì)應(yīng)的含義可參見(jiàn)JavaCC 的語(yǔ)法說(shuō)明。TOKEN 說(shuō)明詞法標(biāo)記。SPECIAL_TOKEN說(shuō)明在解析過(guò)程中將被忽略的詞法標(biāo)記,SPECIAL_TOKEN 同于SKIP,但區(qū)別在于這些標(biāo)記可在解析過(guò)程中經(jīng)過(guò)適當(dāng)處理后被恢復(fù)。MORE 說(shuō)明一個(gè)部分標(biāo)記(partial token),一個(gè)完整的標(biāo)記由MORE 序列后跟一TOKEN 或SPECIAL_TOKEN 組成。詞法規(guī)則用正則表達(dá)式(Regular Express ion)來(lái)描述。
(4)產(chǎn)生式(production):產(chǎn)生式用來(lái)定義語(yǔ)法中的非終端語(yǔ)法元素。每個(gè)非終端語(yǔ)法元素對(duì)應(yīng)一Java 方法,編譯器通過(guò)對(duì)應(yīng)的方法調(diào)用來(lái)實(shí)現(xiàn)對(duì)非終端描述的編譯。
就IAPL 而言,在其編譯器的實(shí)現(xiàn)中,相對(duì)應(yīng)地:
(1)各option 項(xiàng)取值為默認(rèn)值。
(2)Java 編輯單元中,PARSER_BEGIN 和PARSER_END 指定生成的Java 解析器的名稱為IAPLParser,其包含的部分代碼如圖3所示。
(3)詞法說(shuō)明部分,SKIP、TOKEN、SPECIAL_TOKEN、MORE 分別說(shuō)明IAPL 形式規(guī)范中的對(duì)應(yīng)內(nèi)容。
(4)產(chǎn)生式部分,形式規(guī)范中的每一個(gè)語(yǔ)法元素,每個(gè)元素對(duì)應(yīng)于Parser.jj 中一個(gè)同名的方法,如圖4所示。第一個(gè)方法為:
使用JavaCC 命令運(yùn)行Parser.jj(JavaCC IAPLParser.jj),可以生成特定詞法和語(yǔ)法分析器,生成的源程序包含七個(gè)Java 源程序,其中前三個(gè)是基于IAPL 語(yǔ)法的,其它四個(gè)是通用的,起輔助作用的Java 文件。
應(yīng)用程序可編譯這七個(gè)Java 源文件,并將它們與應(yīng)用程序相鏈接,從而提高效率。將所生成的Java 代碼語(yǔ)法分析器主程序中的有關(guān)類(lèi)用“import”命令包含在實(shí)現(xiàn)的Java 代碼中,就可以方便、高效地實(shí)現(xiàn)程序的編譯[13]。Agent 解釋器在執(zhí)行程序之前先調(diào)用上述生成的解析器對(duì)程序進(jìn)行詞法分析。
目前Agent 理論與技術(shù)研究核心內(nèi)容之一便是Agent 程序設(shè)計(jì)語(yǔ)言。面向Agent 的程序設(shè)計(jì)語(yǔ)言(AOPL)便于描述和表達(dá)Agent的多種擬人的智能特性:自主性、主動(dòng)性、可動(dòng)性、反應(yīng)性、社會(huì)性,支持Agent 的感知、識(shí)別,推理、決策,動(dòng)作和行為能力的實(shí)現(xiàn)[14]。本文提出的面向智能Agent 程序設(shè)計(jì)語(yǔ)言IAPL 彌補(bǔ)了現(xiàn)有Agent語(yǔ)言存在的不足,根據(jù)其語(yǔ)言形式規(guī)范,運(yùn)用JavaCC 實(shí)現(xiàn)其編譯器,提高了開(kāi)發(fā)效率。
今后的工作主要有:結(jié)合使用JavaCC 及其伙伴工具,如JJDoc 和JJTree 來(lái)進(jìn)一步提高實(shí)現(xiàn)IAPL 語(yǔ)言編譯器的效率。基于IAPL 開(kāi)發(fā)原型支撐系統(tǒng),為系統(tǒng)編制Agent 提供支持。