WHITENOISE

辞書

この人工無脳はグリーン辞書、レンダリング辞書、メイン辞書を使います。3つの辞書は同じ記憶空間(ハッシュ)に蓄えられ、メイン→レンダリング→グリーンの順で上書きされるため、メインとグリーンに同じキーを持つ記憶があった場合はグリーン辞書の内容だけに反応することになります。グリーン辞書はユーザが教えた内容を保持する辞書で、人工無脳によって自動的に生成されます。レンダリング辞書は挨拶やシステム関係の返答などを生成するためにユーザが定義しなければならない記憶だけを集めた辞書です。メイン辞書はそれ以外のすべての記憶を置くファイルで、ユーザによって作られます。

辞書の文法

すべての辞書は同じ文法で記述されます。必要最低限の文法は

キー文字列/テーマ 返答文字列,返答文字列,返答文字列・・・

のようにキー文字列と、それに対する返答文字列で構成されます。返答文字列が複数あった場合はその中からランダムにひとつを選んで返答とします。テーマは文字通りキーで引き出される内容が何についての話なのかを簡潔に表す文字列で、省略できます。返答文字列中に$car$のように'$'で囲まれた文字列が含まれている場合、人工無脳はそれを再帰的に展開します。たとえば次のような記憶があった場合、ユーザが"車"を含む台詞を人工無脳に向かって言うと

$I$ 私,あたし,わたし,まなちゃん,まなちゃん
車 $I$は車のこと良くわかんない。

$I$はそれに続く私,あたし,わたし,まなちゃん,まなちゃんのなかから毎回ランダムにひとつを選ぶので、常にまったく同じ台詞が帰ってくることはありません。これと同じような構文として'%'で囲まれた文字列はシステムの環境変数のようなもので、決まった文字列に展開されます。

%uname%ユーザの名前
%name%人工無脳の名前
%theme%現在のテーマ
%time%現時刻 hh:mm:ss
%date%今日の日付 yy:mm:dd
%season%季節
%zone%時間帯(深夜,早朝,朝,昼・・・)
%vcond%人工無脳の体調(1〜5)
%assoc%現在のテーマから何かを連想します

'!'で囲まれた文字列は特殊で、組み合わせを記述するのに使います。たとえば人工無脳に「[キャラクタ]の[必殺技]みたいだね!」という内容をしゃべらせたいとき、

$chr$の$skill$みたいだね

としたのでは$chr$と$skill$がそれぞれ独立に選ばれるためにあまり意味のある文を生成できません。これを解決するために

!chr-skill! キン肉マン|筋肉ドライバー,ねこまた|ネコパンチ,タクシー運転手|乗車拒否,ガッツ|大砲ぎり
技 !chr-skill!%A%の%B%みたいだね

とします。!chr-skill!が返答文字列中に見つかると人工無脳は%A%,%B%などにランダムに選んだペアの前者と後者を代入し、!chr-skill!自体は空文字列に置き換わります。この仕掛けは偽春菜のchainedを参考にして導入されました

%educate%はこれと同じような仕掛けで、%educate%が見つかると人工無脳は過去に誰かがしゃべった意味のわからなかった言葉を捜し、その内容を%value%、教えてくれた人の名前を%teacher%に代入します。これによって

聞いて %educate%ねえ、このまえ%teacher%さんが「%value%」っていってたんだけど
のような方法で教育を促す文を生成することができます。ここでも%educate%自身は食う文字列に置き換わります。さらにこの文をしゃべった後、ユーザに辞書書きこみ権限がある場合は教育ダイアログが表示され、その内容を元にグリーン辞書に新しい記憶が追加されます。