知恵袋で柔らかい書き換え(Fuzzy Rewriting)について質問を受けました.ちょっと嬉しいので,ここに回答を書いておきます.
どんな発明もそうですが,ビスケットにもそれが発明される以前のものがあって,その欠点を補うということで作られてます.
Stagecastというもので,これは元々はアップルリサーチで作られた KidSim の商品版です.KidSimは古いマックの上で動いてまして,僕も学生の頃に触って感動しましたけれど.まさか自分が子供向けの言語を作るなんて思っていなかった時代です.
KidSimの論文はこれですが,英語を読まないでもここで使われている絵を見ればビスケットに似ていることがわかります.94年ですから20年以上前ですね.
たとえば,
![](https://blogimg.goo.ne.jp/user_image/7e/02/a56673a94d4127aa9dfdb4e5ca53cb06.png)
です.ゴリラが岩の前にいたら岩を飛び越えて反対側に行く,という命令ですね.
KidSimは当時のコンピュータの限界もあったと思いますが,格子状に配置されたアイコンの位置関係を規則に従って書き換えて行く,という言語です.ビスケットと違ってアイコンには内部状態をもたせることができて,例えば自動車だったら燃料という状態があって,1つ前に進むごとに燃料を1つずつ減らして行くとか,燃料が空になったら止まるとか,そういったプログラムが書けるようになってます.Simというのはシミュレーションのことですが,値を使ったシミュレーションがちゃんと作れるようになっています.
ビスケットはそういった内部状態の部分は全部切り捨ててますね.機能を削るのは研究としては主張しにくいですが,言語の方向性を明確にするという意味では尖らせてます.
ビスケットが新たに導入したのは,アイコンは格子状ではなく自由な位置に置けて,しかも回転させることができる,ということです.それだけが違いです.だからビスケットで回転させないタイプの例題(たとえば二進法のプログラムとか前回のソートのプログラムとか)はそのままKidSim (Stagecast)で走らせることができると思います.感染が広がるやつもできると思う(内部状態はあまり入れたくなかったですが,いま考えると感染の強さとか治りかけとか,そういう表現のためには入れてみてもいいかもしれませんね).
で,そうやって書き換え対象と規則(めがね)を柔軟にしたときに,課題なのはどうやって動かすのかです.格子状のアイコンの場合はアイコンの配置がピッタリ決まっているので,それと同じ配置を探すというのは全然難しくありません.それに対してビスケットでは厳密に同じ配置で探すのではなくて,似ている配置であればOKにしようという方針にしました.つまり書き換え規則を曖昧に柔軟に解釈しようということですね.
めがねの中に部品がそれぞれ1つだけのときは曖昧性はないのですが,部品が2つずつ入ったとき.たとえば感染が広がる例の「ぶつかったら」の部分です.正確にこの配置でぶつかるのだけでなく,大体こんな感じでぶつかったら,という解釈をしよう,ということです.そのときめがねに入っている配置に対して,どれくらずれているかという計算をします.ピッタリ同じ場合もあるし,少しだけズレた場合もあるし,ギリギリぶつかった場合もあるし.そのズレは,書き換えの結果,つまり「風邪がうつる」の部分に反映されます.風邪がうつるの場合も正確にこの配置で風邪の人が出現するのではなくて,ピッタリ同じの場合は同じ配置になるけれど,ズレていたらそのズレに応じて出現する位置も変わる,という計算をしています.こういう部分が,ビスケットを動かしていて飽きないアニメーションになっている理由だと思います.曖昧なマッチングをしても生成が厳密のままだったら生成されるアニメーションはどんどん単調になっていくはずです.
でこの方法をFuzzy Rewriting(柔らかい書き換え)と名付けました.
実はこの柔らかい書き換えは,アイコンの配置の書き換えにしか使えないわけではありません.一般化することができます.何かの対象をベクトルで表現して,それの時系列変化を発生させる.書き換え規則は,変数を使って定義する代わりに,書き換えの代表的な例を示して定義する,という解釈になります.説明がどんどん難しくなりますが,もっと広い応用があるんですよってことですね.
例えばピアノにしてみると
「ドレミ」→「ミレド」
ドレミと弾いたら,ミレドというのが返ってくるという鍵盤のメガネを作りました.それに対して
「ドレファ」
と弾いたら,何が返ってくるのかということです.で柔らかい書き換えで動くピアノの場合は
「ファレド」
というのが返ってきます.メガネを沢山いれてあげて,勝手に演奏するシステムができて行きますね.
具体的な計算方法ですが,バージョンが変わってまして,初期の計算は論文にもなっているのですが,最新のはコードだけです.初期の計算方法に関しては
https://github.com/viscuit/viscuit6
で密かに公開していたりします.これだけではビスケットは動きません.
どんな発明もそうですが,ビスケットにもそれが発明される以前のものがあって,その欠点を補うということで作られてます.
Stagecastというもので,これは元々はアップルリサーチで作られた KidSim の商品版です.KidSimは古いマックの上で動いてまして,僕も学生の頃に触って感動しましたけれど.まさか自分が子供向けの言語を作るなんて思っていなかった時代です.
KidSimの論文はこれですが,英語を読まないでもここで使われている絵を見ればビスケットに似ていることがわかります.94年ですから20年以上前ですね.
たとえば,
![](https://blogimg.goo.ne.jp/user_image/7e/02/a56673a94d4127aa9dfdb4e5ca53cb06.png)
です.ゴリラが岩の前にいたら岩を飛び越えて反対側に行く,という命令ですね.
KidSimは当時のコンピュータの限界もあったと思いますが,格子状に配置されたアイコンの位置関係を規則に従って書き換えて行く,という言語です.ビスケットと違ってアイコンには内部状態をもたせることができて,例えば自動車だったら燃料という状態があって,1つ前に進むごとに燃料を1つずつ減らして行くとか,燃料が空になったら止まるとか,そういったプログラムが書けるようになってます.Simというのはシミュレーションのことですが,値を使ったシミュレーションがちゃんと作れるようになっています.
ビスケットはそういった内部状態の部分は全部切り捨ててますね.機能を削るのは研究としては主張しにくいですが,言語の方向性を明確にするという意味では尖らせてます.
ビスケットが新たに導入したのは,アイコンは格子状ではなく自由な位置に置けて,しかも回転させることができる,ということです.それだけが違いです.だからビスケットで回転させないタイプの例題(たとえば二進法のプログラムとか前回のソートのプログラムとか)はそのままKidSim (Stagecast)で走らせることができると思います.感染が広がるやつもできると思う(内部状態はあまり入れたくなかったですが,いま考えると感染の強さとか治りかけとか,そういう表現のためには入れてみてもいいかもしれませんね).
で,そうやって書き換え対象と規則(めがね)を柔軟にしたときに,課題なのはどうやって動かすのかです.格子状のアイコンの場合はアイコンの配置がピッタリ決まっているので,それと同じ配置を探すというのは全然難しくありません.それに対してビスケットでは厳密に同じ配置で探すのではなくて,似ている配置であればOKにしようという方針にしました.つまり書き換え規則を曖昧に柔軟に解釈しようということですね.
めがねの中に部品がそれぞれ1つだけのときは曖昧性はないのですが,部品が2つずつ入ったとき.たとえば感染が広がる例の「ぶつかったら」の部分です.正確にこの配置でぶつかるのだけでなく,大体こんな感じでぶつかったら,という解釈をしよう,ということです.そのときめがねに入っている配置に対して,どれくらずれているかという計算をします.ピッタリ同じ場合もあるし,少しだけズレた場合もあるし,ギリギリぶつかった場合もあるし.そのズレは,書き換えの結果,つまり「風邪がうつる」の部分に反映されます.風邪がうつるの場合も正確にこの配置で風邪の人が出現するのではなくて,ピッタリ同じの場合は同じ配置になるけれど,ズレていたらそのズレに応じて出現する位置も変わる,という計算をしています.こういう部分が,ビスケットを動かしていて飽きないアニメーションになっている理由だと思います.曖昧なマッチングをしても生成が厳密のままだったら生成されるアニメーションはどんどん単調になっていくはずです.
でこの方法をFuzzy Rewriting(柔らかい書き換え)と名付けました.
実はこの柔らかい書き換えは,アイコンの配置の書き換えにしか使えないわけではありません.一般化することができます.何かの対象をベクトルで表現して,それの時系列変化を発生させる.書き換え規則は,変数を使って定義する代わりに,書き換えの代表的な例を示して定義する,という解釈になります.説明がどんどん難しくなりますが,もっと広い応用があるんですよってことですね.
例えばピアノにしてみると
「ドレミ」→「ミレド」
ドレミと弾いたら,ミレドというのが返ってくるという鍵盤のメガネを作りました.それに対して
「ドレファ」
と弾いたら,何が返ってくるのかということです.で柔らかい書き換えで動くピアノの場合は
「ファレド」
というのが返ってきます.メガネを沢山いれてあげて,勝手に演奏するシステムができて行きますね.
具体的な計算方法ですが,バージョンが変わってまして,初期の計算は論文にもなっているのですが,最新のはコードだけです.初期の計算方法に関しては
https://github.com/viscuit/viscuit6
で密かに公開していたりします.これだけではビスケットは動きません.