シナリオ記述言語 Q

Qについてチュートリアルダウンロード関連論文連絡先

<English>

記述例

defcue defaction

キューとアクションの定義を行う. エージェントに対してシナリオでパラメータの値を与えたい場合はin,エージェントが値を返す場合はoutを指定する.

(defcue ?receive_selection (:selection in))
(defcue ?receive_text (:text out))

(defaction gesture (:animation in))

defagent

エージェントの定義を行う.

(defagent Merlin
  :scenario scenario_merlin
  :location '(20 40)
  :shape '("Merlin.acs"))
        

defscenario

エージェントに与えるシナリオの記述を行う.シナリオ内の局所変数はletで定義できる.
シナリオの中にはシーンという形で状態を定義できる. ここでは、scene1というシーンが定義されている.

(defscenario scenario_merlin (&pattern ($x #f) &aux (time #f))

 (introduction
  (#t
   (!fly :to_coordinate '(50 300))
   (!speak :sentence "私はマーリンです.")
   (!speak :sentence "読売新聞に行きます.")
   (!display :url "http://www.yomiuri.co.jp")
   (!speak :sentence "あなたは今何に興味,関心がありますか.")
   (!request_selection :selection_list '("アメリカ同時多発テロ"
                     "World Cup2002"
                                         "その他"))
   (go asking_question))

guard付きコマンド

複数のキューを平行観測するためのコマンドとして, guard付きコマンドがある. guard節により並べられた複数のキューは,エージェントにより平行観測される.そして,エージェントは成立するキューを1つ選び,その後に続くアクションを実行する。
ここでは,scene1でエージェントが表示したリストの中から,ユーザが選択したものに対して,それぞれの対応が記述されている. ユーザの選択がなされるまで,エージェントは何もせず待ち続ける.ただし,シーンの先頭にあるguardは,以下のように省略することが可能である.

 (asking_question
      ((?receive_selection :selection 0)

    	(!display :url "http://www.yomiuri.co.jp/attack/index.htm")
    	(!speak :sentence "アメリカのアフガニスタンへの攻撃について賛成ですか
             反対ですか.") (!request_text :sentence "ここに入力してください.") (go About_Afghanistan))   ((?receive_selection :selection 1) (!display :url "http://www.yomiuri.co.jp/sports/wcup2002/main.htm") (!speak :sentence "ワールドカップではどこが優勝すると思いますか.") (!request_text :sentence "ここに入力してください.") (go About_WorldCup)) ((?receive_selection :selection 2) (!speak :sentence "では何に興味,関心がありますか.テキストボックスに
             入力してください.") (!request_text :sentence "ここに興味,関心のあることを入力してください.") (go About_else))))

パターン変数

キューでの観測結果を変数に代入する際はパターン変数を用いる.パターン変数は$ で始まる変数である.
ここでは,?receive_textというキューの観測によりユーザからの入力がパターン変数$xに代入される.
$xの値に応じて,フランス,ブラジル,イタリア,イギリス,その他といったユーザからの返答への各対応が記述されている.

  (About_WorldCup

   ((?receive_text :text $x)  
    (cond
      ((all-keywords? '("フランス") $x)
       (!speak :sentence "やはり強いですよね.私もフランスだと思います."))
      ((all-keywords? '("ブラジル") $x)
       (!speak :sentence "予戦は苦戦していたみたいですよ."))
      ((all-keywords? '("イタリア") $x)
       (!speak :sentence "誰が好きですか.")
       (!request_text :sentence "ここに入力してください.")
       (go About_Italian_Player))
      ((all-keywords? '("イギリス") $x)
       (!speak :sentence "今オーウェンが絶好調ですよね."))
      (else
       (!speak :sentence (string-append "なぜ" $x "が優勝すると思いますか"))
       (!request_text :sentence  "ここに入力して下さい.")
       (go About_another_country)))))

 

Copyright(C) Ishida lab. All rights researved.