ᵡᵿᵱᵮᵟ ᵣᶌᶅᶇᶌᶃ
5.13 結言
本章では,組織に属する人間の行動を模擬する方法として,複雑かつ不完全な情報しか 得られない場合においても,エージェントが人間行動を模擬する場合には問題解決のため のプランニングアルゴリズムである連鎖的部分目的生成アルゴリズムCaSPA(Cascaded Sub-goals Production Algorithm)を提案し,そのアルゴリズムについて記した.
また,完全な情報が得られない状況における脱出ゲームを作成し,実際にCaSPAを 利用して単独エージェントがゴールに到達できること実験によって確認し,その問題 解決能力を示した.
さらに,複数のエージェントの協調行動が必要な状況についても実験を行い,階層 構造を有する組織による問題解決がCaSPAにより可能であることを示した.
また,本研究において作成したCaSPAルール入力補助プログラムについて記した.
本プログラムはグラフィカルな表示機能を有しており,CaSPAのタスク間の関係を視 覚的に容易に理解することができることを示すとともに,GUIを利用したルール構築 方法について述べた.また,本プログラムのコードエディターにおけるユーザー補助 機能について説明し,動的言語においてもユーザー補助を行うための技術について述 べた.
以上により,本研究における行動判断ルール解釈機構CaSPAのためのルール構築シ ステムとして本プログラムが有効に働くことを示した.
5.A付録:Hello Worldをパースするためのパーサーコード
5.A 付録: Hello World をパースするためのパーサーコー ド
001: public void test() { 002:
003: Parser parser=new Parser();
004: String source=this.loadFile();
005: System.out.println("DEBUG: define rules");
006:
007: parser.addSpecialRuleToken("WHITESPACE","^[\\s|\n]+$");
008: parser.addParseRuleToken("ASTAR","\\*");
009: parser.addParseRuleToken("SLASH","\\/");
010: parser.addParseRuleToken("SHARP","\\#");
011: parser.addParseRuleToken("INCLUDE","include");
012: parser.addParseRuleToken("INT","int");
013: parser.addParseRuleToken("VOID","void");
014: parser.addParseRuleToken("DQUOTE","\"");
015: parser.addParseRuleToken("{","\\{");
016: parser.addParseRuleToken("}","\\}");
017: parser.addParseRuleToken("(","\\(");
018: parser.addParseRuleToken(")","\\)");
019: parser.addParseRuleToken(";",";");
020: parser.addParseRuleToken("IDENTIFIER","([a-z]|[A-Z]|_)([a-z]|[A-Z]|_|[0-9])*");
021:
022: ParseRuleStatement commentStart=new ParseRuleStatement("COMMENT_START"); // コメント開始 023: commentStart.addRule("SLASH","ASTAR");
024: commentStart.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
025: parser.addParseRule(commentStart);
026:
027: ParseRuleStatement commentEnd=new ParseRuleStatement("COMMENT_END"); // コメント終了 028: commentEnd.addRule("ASTAR","SLASH");
029: commentEnd.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
030: parser.addParseRule(commentEnd);
031:
032: ParseRuleStatement comment=new ParseRuleStatement("comment"); // コメントステートメント 033: comment.addRule("COMMENT_START","^COMMENT_END*","COMMENT_END");
034: comment.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
035: parser.addSpecialRule(comment);
036:
図 5.29: Hello Worldに対するパーサーコード(1/3)
5.
037: ParseRuleStatement functionCall=new ParseRuleStatement("functionCall"); // 関数呼び出し 038: functionCall.addRule("IDENTIFIER","argument",";");
039: functionCall.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
040: parser.addParseRule(functionCall);
041:
042: ParseRuleStatement functionBlock=new ParseRuleStatement("functionBlock");// 関数定義のブロック 043: functionBlock.addRule("{","functionCall*","}");
044: functionBlock.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
045: parser.addParseRule(functionBlock);
046:
047: ParseRuleStatement argument=new ParseRuleStatement("argument"); // 引数ステートメント 048: argument.addRule("(",")"); // 再度定義する
049: argument.addRule("(","term","commaTerm*",")");
050: argument.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
051: parser.addParseRule(argument);
052:
053: ParseRuleStatement type=new ParseRuleStatement("type"); // 型 054: type.addRule("INT");
055: type.addRule("VOID");
056: type.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
057: parser.addParseRule(type);
058:
059: ParseRuleStatement string=new ParseRuleStatement("string"); // 文字列 060: string.addRule("DQUOTE","^DQUOTE*","DQUOTE");
061: string.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
062: parser.addParseRule(string);
063:
064: ParseRuleStatement includeRule=new ParseRuleStatement("include"); // include 065: includeRule.addRule("SHARP", "INCLUDE", "string");
066: includeRule.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
067: parser.addParseRule(includeRule);
068:
069: ParseRuleStatement function=new ParseRuleStatement("defineFunction"); // 関数定義 070: function.addRule("type","IDENTIFIER","argument","functionBlock");
071: function.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
072: parser.addParseRule(function);
073:
074: ParseRuleStatement mainRule=new ParseRuleStatement("program"); // プログラムを構築するための ルール
075: mainRule.addRule("include*","defineFunction+");
076: mainRule.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
077: parser.addParseRule(mainRule);
078:
図 5.30: Hello Worldに対するパーサーコード(2/3)
5.A付録:Hello Worldをパースするためのパーサーコード
079: parser.addParseRuleToken(",", ","); // コンマを定義 080:
081: ParseRuleStatement term=new ParseRuleStatement("term"); // 項を定義 082: term.addRule("IDENTIFIER");
083: term.addRule("string");
084: term.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
085: parser.addParseRule(term);
086:
087: ParseRuleStatement cTerm=new ParseRuleStatement("commaTerm"); // コンマと項を定義 088: cTerm.addRule(",", "IDENTIFIER");
089: cTerm.addFunctionClass(FunctionDumpTree.class, FunctionDumpTree.NAME);
090: parser.addParseRule(cTerm);
091:
092: System.out.println("DEBUG: parsing...");
093: Statement program=null;
094: try{
095: program=parser.parse(source, mainRule);
096: program.getFunction(FunctionDumpTree.NAME).exec();
097: Exception err=parser.getError();
098: System.out.println(err);
099: }catch(Exception e){
100: e.printStackTrace();
101: }
102:
103: System.out.println("DEBUG: parsing...FINISH");
104:
105: // パーシングした構文チェック
106: analyze(program.getArrangedStmt(), 0);
107:}
図 5.31: Hello Worldに対するパーサーコード(3/3)