○File No.8

会話のアルゴリズムII


挨拶・機能・やり取り・デッキ

 たとえば友達に何かを問い合わせているときと,挨拶しているときでは,われわれは根本的に違うロジックをつかって思考していると思われる.挨拶時には,現在の時刻,季節,天気などの環境的条件や,その人に前回会ってから何日経ったとか,自分と相手の立場などを評価してどんな挨拶をするか決定する.返ってくる答えは特に期待していない.
 一方人間が業務を行っている場合は,―人工無脳で言うところのおみくじなどの要求にあたるが―,命令を受け取って,それに基づいて作業し,答えを返すだけで,業務に関係ないやり取りはしないし、非常に定型的な会話を行えばすむ。
 また一般的なやり取りをしているときにはそれと関係ないことは無視しており,相手が伝えようとする未知の概念を自分の頭の中で再現しようと努力している.
 さらに話題を開こうとする瞬間には自分の記憶を大急ぎで検索して,相手が喜びそうななトピックを探し出してこなければならない.

このように一口に会話といってもさまざまな仕掛けの集合体であることがわかる.したがってそれを一元的に表現できるような万能のクラスなどはとても設計できそうにないし,きわめてメンテナンス性に乏しくなる.そこでサブサンプションと呼ばれる考え方を導入し,もともと独立であった複数の仕掛けを独立のまま作って共存させる方法を使うと自然である.


人工無脳のコアの例
左の例では,まずメッセージキューが処理され,キューが何も結果を出力しなかった場合,Responseに処理が移る.Responseでは人間と無脳の発言をスタックとして数行記憶していて,次にどんな発言をすれば良いか評価する.ここで特に発言する必要がない場合(=スタックが空の場合)Deckに処理が移り,デッキからカードをいちまい引いて,それを実行する.一見特殊に見えるが,この仕掛けはコード上では極めて単純に,
	$msg=&MessageQueue;
	return $msg if $msg ne "";

	$msg=&Response;
	return $msg if $msg ne "";

	return &Deck;
程度にあらわせば済むことで,何も変わった点はなく,すでにuzuraなどで実装されているようである.この考え方の利点は,会話のアルゴリズムをいくつもの部分に分けて考えられることと,それらをあとで簡単に結合できることである.ちなみに従来の人工無脳が行なっていた機能は&Deckのなかの,「適当に話し始める」というカード一枚分になる.

メッセージキュー

メッセージキューは,人工無脳が複数回の発言を一度に行ないたいときに利用される.
[PREV] 会話のアルゴリズムI ELIZAの語るもの[NEXT]