QiChat MANIAX(1) Topicファイルのルールについてイントロ編

#はじめに
前回のあとがきでも書きましたが、今回からはPepper SDK入門とは別に、QiChat MANIAXとしてTopicファイルのルールを詳述していきます💎

さて、[Pepper SDK入門(24)](https://qiita.com/kskrin/items/1ad470634d8b36cb1f5d)で触れたように、Topicファイルには先頭にファイルの名前を記述するなどのルールがありました。例としては次のようなものです。

```
topic: ~introduction ()

u:(ソルトちゃんこんにちは) ぼくPepperですけど
```
今回はQiChat MANIAXのイントロダクションとして、このTopicファイルのルールの概要を見ていきます⛵️

#ルール事始め〜郷に入った場合の郷を知る〜
ここで言うルールとは、ユーザー入力とPepperの返答を関連づけるものです。
区切り文字、ルールの機能や特徴が様々なケースに対応してくれます。恢恢！
ルールにはユーザールール、ユーザーのサブルール、Proposalの三種類があります。

#ユーザーとPepperとルールの相関図🔺(三角関係ではない)
ユーザーの入力部分は括弧で区切り、Pepperが理解できるメッセージを記述しましょう。（この括弧内のメッセージを音声認識します)
ユーザー入力を認識した時にルールに続く処理が実行され、該当ルールを含むTopicがフォーカスされます。上の例で言うと、"ソルトちゃんこんにちは"がユーザーの音声認識がされる部分であり、"ぼくPepperですけど"がPepperの発話する部分です。

#conceptのコンセプト(概念)について🍌
conceptとは、関連するワードやフレーズのことです。国のリスト、名前のリスト、類義語などですね。マジカルバナナは始まりません🔕
コンセプトには二種類あり、ユーザー入力でもPepperの返答でも使えます。

|タイプ |スコープ  |実行時  |構成要素  |
|---|---|---|---|
|Static  |global  |変更できない |Choice: [ ]<br>Optional part: { }<br>concepts (staticとdynamic)<br>functions (<font color="#1e90ff">**^rand**</font>, <font color="#1e90ff">**^first**</font>)<br>Variable: $とConditions: == > <> <|
|Dynamic  |global  |プログラム上で設定が必要  |Choice: [ ]内のワードとフレーズのリスト  |
…これだけでは何の話かまるで分からないと思いますので、もう少し詳しく説明すると、

```
concept:(want) [仏の御石の鉢 蓬莱の玉の枝 龍の首の珠 火鼠の裘 燕の産んだ子安貝]
```
staticというのはこのようにTopic上で全て記述され、プログラムから変更されません。

```
dynamic:want
```

```java
QiChatbot qiChatbot = ...;
EditablePhraseSet editablePhraseSet = qiChatbot.dynamicConcept("want");
List<Phrase> phrases = new ArrayList<>();
phrases.add(new Phrase("仏の御石の鉢"));
phrases.add(new Phrase("蓬莱の玉の枝"));
phrases.add(new Phrase("龍の首の珠"));
editablePhraseSet.addPhrases(phrases);
```
dynamicの方はTopicファイルではなくプログラム上で内容を記述する、ということです。上記に人魚の肉や猿の手を後出しすることも可能になります🥩🐒
表にある未知の単語については次回以降順番に紹介しますので、あまり気にせず読み進めてください🚶‍♂️

#オンオフをスイッチする💡🌌
Topicとルールは、Dialogエンジンで利用されます。
Topicのオンオフは、会話のコンテキストを作成しメモリ上のルール管理の量を減らすために切り替えることが可能です。無効になっているTopicのルールは機能しません。
次の場合、Topicは有効であってもルールが機能しないので注意しましょう。

* 親のルールが実行されていないサブルール。サブルールについては別途説明予定のため、名前だけ覚えておいてください
* 一度実行されたProposal
* 機能しないBookmarkが含まれている
* ルールに<font color="#1e90ff">**^private**</font>がついており、Topicにフォーカスが当たっていない場合

また、TopicはTopicStatusのオブジェクトによって管理されます。
詳しくは[Pepper SDK入門(24)](https://qiita.com/kskrin/items/1ad470634d8b36cb1f5d)を参照してみてください。

#フォーカスという名のスポットライト🔦✨
いくつかのTopicは同時に利用できますが、Focusを持てるのは常に一つの選ばれしTopicだけです。
Focusは、<font color="#1e90ff">**^noStay**</font>以外のルールを含むTopicへ与えられます。
もし複数のルールがTopic同士で被っている場合、Focusを持つTopicが優先されます。それ以外の場合はランダムに選択され、DialogエンジンがTopicにフォーカスを与えて先頭のProposalが実行されるケースもあります。
ちなみに次回の内容を少しだけ先取りすると、<font color="#1e90ff">**^noPick**</font>はその自動選択を阻止してくれるものです🛑詳しくは次回以降、他の関連するルールと共に解説しますね👓

#Topicの優先順位👑
Topicが複数存在する場合、ルールは次の順番で考慮されます。

|順番            |ルールの位置          |
|:---------------|:---------------           |
|Focus |Focusを持っているTopic |
|すべてのTopic |<font color="#1e90ff">**^fallback**</font>を持っているTopic以外のすべてのTopic<br>複数の場合はランダム         |
|Fallback |<font color="#1e90ff">**^fallback**</font>を持っているTopic <br>複数の場合は~~ガンダム~~ランダム          |

これはマトリョーシカではなく背の順に並ぶPepperです。
<img width="300px" alt="matryoshkas.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/f26f1ae0-acca-75c0-738d-df2f0a90e550.png">

#ユーザー入力を使い回す🔄
ユーザーの入力を受け取って、Pepperの返答に利用することができます🍥

#Skin(皮膚ではない)
Skinというのはメタルールで、なんとPepperの返答を季節や時間帯などの条件によって返答させることができます！青葉闇の下で日足が短足になりましたなどと話しかけられたら怖いので、機械にも季節感を知っていて欲しいですね👻🍃
ゲームのスキンのようにPepperを着せ替えしたりする機能ではないので注意してください⭕️
<img width="100px" alt="よ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/190bc867-fc2f-0e07-215e-f99bbb7ddaac.png"><img width="100px" alt="１.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/06136c52-4f14-7f9c-e7dd-e283dbc4f2dc.png"><img width="100px" alt="３.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/4c2d91cf-309b-1d36-eb00-29705306d073.png"><img width="100px" alt="ご.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574697/35c4f465-f6f7-7e84-a1c7-571ca5f712c5.png">
#あとがき
今回も[PepperSDKforAndroid](https://android.aldebaran.com/sdk/doc/pepper-sdk/ch4_api/conversation/qichat/qichat_intro.html)を参考に書かせていただきました。

次回からのQiChat MANIAXでは、順番にQiChatの構文を見ていきます！高聞に達して欲しい👂👂
それでは!