RhinoのLiveConnect3とes5の新機能

rhinoでjsからjavaオブジェクトを実装した時、インスタンスはJavaAdapterオブジェクトとなるが、このときjavaメソッドに対して再代入するとエラーが投げられる。

これを回避するには内部[[__proto__]]にアクセスする必要があるのだが、最近のRhinoはes5準拠でObject.create(proto, pd)が使える。
引数protoにJavaAdapterインスタンスを与えてやれば同じことが出来る。

しかし、Object.create()で返されるインスタンスはプロトタイプチェーンを差し替えた別の新たなインスタンスなのでJavaAdapter型ではなく(jsのObjectオブジェクトである)NativeObject型になる。
これによってLiveConnectの通信が阻害されjs2java変換がうまくいかなくなる。

LiveConnectはJavaAdapter型を見つけるとアンラップしてアダプタが持つjavaオブジェクトを返すが、
Object.create()が返すインスタンスは直接なJavaAdapterではないのでそれができない。
なので結局、JavaAdapterを再利用するには内部[[__proto__]]にアクセスする事が不可欠だ。

ひとことで言ってしまえばクラスベースのようにjavaクラスを拡張したjsオブジェクトをさらに拡張することはできない。
関連してJavaAdapterインスタンスのdescriptorにはアクセス出来ないようだ。

また、LiveConnectはもともとブラウザのスクリプトエンジン側に実装されていた機能だがLC3より後はJavaVM側に再実装されてnew java pluginの機能となった。
これによってブラウザのスクリプト言語とjavaと通信する責任はjava側に移ったためLiveConnectはスクリプトエンジンが持つ仕様ではなくなってしまった。
Rhinoは独自にLC3を実装していたため、今後この変更がどう影響するのかはわからない。

今まではmozilla製品としてLiveConnectが使えたがjsの一機能として仕様のアップデートが行われなくなればRhinoの現状に合わなくなってしまう。

古いLC3を置き去りにしたままrhino自身は進化していくのだろうか?

箱庭ゲーのAIのためにツンレデの思考をモデル化する

表題のとおりである。だが真っ先に壁にぶち当たったのでそれを確認しておく。

ツンデレの定義とは何かということだ。

これには主に2つあってA)はじめはツンツン、後からデレデレとB)ツンツンしている面とデレデレしている面というもの。
要するに状態遷移による変化と二面性による変化のどちらかのことで、どちらもギャップ萌えという話だ。

しかし、問題はこれをどうモデル化するかなので話を戻す。この2つにおいては動機付けが焦点になるだろう。Bの方はいわゆる反動形成ともとれる。

  • Aは事象に対するリアクションを返すステートマシンだが、特定の事象に対して好意度が加算され一定値を超えると状態が遷移すると見ていいだろう。
  • Bはもっと複雑で抑圧された欲などに対する正反対の行動なのでまず「やりたいことリスト」が存在する。
    これは何かしらによって重みが付けられた優先度つきキューに置き換える。
    キューを頭から見にいって実行不可なら抑圧度を加算する、実行可能ならタスクの実行をし抑圧度を下げる。
    このときタスクの重みを考慮して抑圧度の加減算を行うことにする。そして、抑圧度が一定値を超えるとタスクと正反対の行動を取る。
    これが「ツンの状態」、ツンの状態中は抑圧度が下がるまでタスクと正反対の行動を取り続ける。逆に「デレの状態」はツンの状態以外の状態のことと定義できるだろう。

まとめるとタスクリストを入力して可能かどうかで負荷が係っていき一定値を超えると特殊な状態へ推移して特殊な出力を返すオラクルマシンと言える。
本来ならリストの全てが不可能なタスクだとループするが不可能なタスクを何度も見つけると不可能なタスクに対して本来とは違った出力を問答無用で返すオラクルを持ちこれによってマシンは必ず停止する。論点ではないので時間は無限にあるとする。

共にステートマシンだがAの状態は事象によって決まる一方、Bの状態は順序付きタスクリストによって決まる違いがある。
これはステートマシンへのインプット生成器が異なることを意味する。

探してみるとこんなものがあった。
【人間の適応的プランニング過程の計算モデル化とその評価】

AとBの両方の特徴を合わせ持つならこれで言うBU運動リストがAの入力、TD運動リストがBの入力と当てはめることが出来る。
これならAの条件とBの条件両方を見てどちらか都合のいい方を実行する事ができる。

ちなみにツンデレの状態とはただの二値なので一般化してヤンデレにも適応できるはず。