ビスケットのあれこれ

ビジュアル言語ビスケット(Viscuit)に関するあれこれを書いてゆきます.

Viscuitによる数の定義

2013-11-12 20:47:42 | 1
今回は,情報系の学生向けの話です.

0を含める自然数を定義するときに,0とsuc関数を使う方法があります.

0は自然数である.
Nが自然数のとき,suc(N)も自然数である.

これによって,
0
suc(0)
suc(suc(0))
suc(suc(suc(0)))
...

が自然数になります.これらをアラビア数字で0, 1, 2, 3 ... のように表記すれば我々の良く知っている数になります.

これを使って足し算を定義することができて,

0+N は N
suc(N1)+N2 は N1 + suc(N2)

こうすることで,たとえば,
suc(suc(suc(0))) + suc(suc(0))

suc(suc(0)) + suc(suc(suc(0)))
suc(0) + suc(suc(suc(suc(0))))
0 + suc(suc(suc(suc(suc(0)))))
suc(suc(suc(suc(suc(0)))))
という計算ができます.最初の式をアラビア数字で表すと
3+2
で,最後の式は
5
なので,ちゃんと計算できています.
僕はPrologに感動した人間ですが,Prologではこんな計算をさせて遊ぶことができます(Prolog のもっとすごい面白さは,足し算を教えただけなのに,勝手に引き算をやってしまう,ところなんですが).


さてこれをビスケットで表現するにはどうしたら良いか,という話です.
実は,残念ながら今のビスケットでは動きませんが,こんな感じでやれば動くのではないかと思ってます.

まず,使う記号は

の4つです.
ビスケットには絵の継承を定義するための「ゆきだるま」という機能があります.それを使って自然数Nを定義します.

ゆきだるまの左側は,0はNを継承するという意味です.右側は,N+1はNを継承するとなってます.ここで継承に×が付いているので,実際にはこのように定義してもビスケットでは動作しません.継承で循環を禁止しているからです.循環というのはゆきだるまの上と下にNがありますが,継承をたどったときに同じ絵が出てくることを禁止しているということです.継承するというのは,ピンと来ないかもしれませんが,ビスケットでは同じ動きをする,と言い換えてもよいです.つまり,0はNと同じ動きをする.N+1はNと同じ動きをする,です.

で,もしこの継承の循環を許したとすると,この継承は

このような図の継承をやったことと等しくなります.
0はNと同じ動きをする
0+1はNと同じ動きをする
0+1+1はNと同じ動きをする
0+1+1+1はNと同じ動きをする
これがずっと続きます.
で,Nに対して何か動きをつくれば,それはすべての数が同じように動くということになります.

では早速,Nに対して足し算を定義してみます.

一つ目のメガネは 0+N は N になる.
二つ目のメガネは N +1 + N は N + N +1 になる
というものです.

ここまで用意しておいて,

を書き換えることができるでしょうか.

実は動きません.というのは,NをN+1で置き換えるときに,+1がNの隣の図形と重なってしまって,ぐちゃぐちゃになってしまうからです.図形が自動的に重ならないようにずれてくれることが必要なのですが,別の方法を考えます.

継承でスケールの違う絵を入れてみます.これも今のビスケットでは禁止されてますが,そういう拡張をしたとしたら,

のようになります.
これは
小さい N +1 は 大きいNと同じ動きをする
というものです.ここで大きなNの横幅に対して,小さいNが丁度半分,+1も同じように半分になっているのがミソです.なので,1を足すごとにスケールが1/2になっていきます.たとえば苦しいですがこんな感じ.

構造がN倍に複雑になる場合,スケールを1/Nにするとすることで,どんなに複雑な構造でも,同じ面積に収めることができるようになります.

画面の解像度が無限に細かいとすれば,どんな複雑な構造でも表現できるようになるので,ビスケットのデータ表現能力は一般的な言語の項と同じにまでなれます.

まだ,実装されていないものの話ですから,なんとでも言えるというか,「そういう能力を持つようにビスケットを拡張すれば,そういう能力を持つようになる」という当たり前の話をしているだけなんですけど.

ここでは,項と呼んでますけど,ポインタと言い換えてもよいかもしれません.普通の言語が複雑なデータ構造を簡単に扱える理由はポインタを使っているからです.ビスケットはポインタがない言語ですから,こんな大変なことをしなければならないわけです.

プログラミング言語はもっともっと自由なんだということを言いたくて思考実験をしてみました.

プログラミングはサイエンスか

2013-11-12 01:47:54 | 1
先週末に,お台場でサイエンスアゴラという科学コミュニケーションの祭典にビスケットを出展してきました.
「ビスケットによるプログラミング入門」
サイエンスアゴラは6年目だそうで,ビスケットは初出展です.

やってみた感想としては,子供たちに大人気.幼稚園児でも楽しんでできるので,二日間で何度も足を運んでくれた人もいて,僕らのブースだけちょっと違う雰囲気でした(お隣の黒ラブ教授も他所とは違う雰囲気でしたが).僕たちは,もっといろんな客層を相手にビスケットのイベントをやっていますから,こんな科学教育に理解のあるご家庭のお子さんたちには,ものすごくやり易かったです.みんな頭も良いし,素直だし.それと僕は,色々な科学館の方達ともお話できたし,熱心な親御さんともお話できたし,出展してよかったです.

サイエンスアゴラは前から知ってましたが,これまで出展するのに少し抵抗がありました.その理由は「プログラミングはサイエンスか」ということです.僕自身はサイエンスであると強く思っていますが,一般人はともかく,隣の分野の人たち(たとえば,物理とか化学とかがっちりサイエンスな人たち)からみて,まったくサイエンスであると思われていない,ということをうすうす感じているからです.

僕が学生の頃所属した研究室の教授はすごく理解がありましたが,そこの助教授がガチガチの理論物理でコンピュータを軽蔑していました.コンピュータは学問ではなく就職に有利だからやっているのだろう,と言われました.30年くらい前の話ですけどね.他の科学者たちも,その人ほど思ったことを口にはしないとは思いますが,でもそんなものだろうとは思っています.

いろんな科学館に行ったって,FAXの原理とか,0と1でなんとかとか,底の浅そうなあんまり面白くない展示が多いですから.

コンピュータは何かやりたいことを作るための道具としてはしっかりとした地位を確立したと思います.しかし,ものを作ることに重きを置き過ぎて,コンピュータとはいったいなんだろうか,といったことを考える対象としては見られなくなってしまった.僕が危惧するのは「コンピュータとはなにか」を深く考えずにすごい未来は作れないということです.

一つの例が,ビスケットによる感染のシミュレーションです.
動画
これを説明すると本当に皆さんに面白がってもらえました.この例は「情報とは何か」ということを非常にシンプルに説明しています.普通の物は二つに分けると,それぞれの分量は半分になります.物質は保存則が働くということですね.それに対して,情報はコピーしても減りません.コピーしたものは元のものと全く同じになります.言葉で言うと当たり前のようですが,この原理で動くので,感染は指数関数で広がって行きます.病気がうつった相手も自分と同じ感染源になるわけですから.よく「風邪は他人にうつしたら治る」という冗談を言ったりしますけれど,本当はうつしても治りませんね.病原菌がリソースであれば,相手に渡してしまえば自分は治りますけれど.つまりここでは病気は「情報」としての性質をもっているということなのです.

もう一つは,プログラミング言語の可能性ですね.どれくらいプログラミング言語は人間の発想を超えて自由になれるのか,ということです.ビスケットの入門で出てくる面白い例があります.

魚がボールをツンツンする,というプログラムです.

上のメガネは魚はまっすぐ進む.下のメガネは,魚がボールに当たったら,ボールは前に進んで,魚は後ろに下がる,です.
これを動かすと,魚はボールにツンツンする動きになります.ところが,このメガネのなかのボールと魚の配置を入れ替えると,まったく違った動きをします.

これは,魚とボールがぶつかると,魚とボールは後ろに下がります.その結果,魚はボールを加えて後ろに引っ張っているような動きをします.別の例では,魚がボールに乗っかって動いているように見えたり,ヘディングしたり.
動画

ビスケットの動作は,ステージ場の絵の配置に対して,メガネの中の絵の配置と近いものを探して,みつかったらそのメガネで定義している絵の配置の変化を適用する,というものです.コンピュータにとっては,絵の座標を書き換えているだけで,ツンツンとか,引っ張るといった動きの違いを考えてはいません.

一般的なプログラミング言語では,最初に言葉があります.つまり,ツンツンする動きには「ツンツン」という名前を付けて,引っ張る動きには「引っ張る」という名前をつけます.プログラミンだと,上に行く,下に行くといった動きの方向がすべて違う名前がつけられていますし,スクラッチだとまっすぐ進むことと回転することは違う名前で呼ばれています.動きだけじゃなく衝突判定はほとんど何もできてません.言葉で考えて,それをコンピュータに命令すると動く.それがごく普通のプログラミング言語です.

ところがビスケットの場合はどうでしょうか.動く方向や回転だけでなく,衝突についても色々なぶつかり方を区別できます.ボールが上に当たったとき,下に当たったとき.それらはすべて,絵の配置のバリエーションです.コンピュタにとっては絵の座標の計算だけをしています.人間とコンピュータとのやりとりに,人間用の言葉はでてきません.人間同士がわかり易いように,メガネの並べ方に対して「ツンツン」といった言葉を与える場合はあります.しかし人間がそれを何と言う名前で呼んでいようとコンピュータは関係なく動きます.

多くのビジュアルプログラミング言語が,単にシンタックスエラーを回避する目的にしかビジュアルの良さを使っていません.それに対して,ビスケットのビジュアルは,それが本質的な意味を持っています.そして,人間が使っている不自由な言葉を超えて,もっと多彩な表現力を失わずに残しています.これがビジュアル言語の可能性なわけです.

僕がスクラッチやプログラミンが嫌いなのは,情報とは何かとか,表現力の可能性を追求する,という深い話にならないからです.それで,プログラミングのごく浅い部分しか見せないから,ガチガチの科学者たちに馬鹿にされるわけです.


追記
スクラッチがサイエンスかどうかは,サイエンスをどう定義するかということですし.というより,ツールがサイエンスかどうかを決めるのではなく,どういう立場でツールを使うのかということで決まるのだと思います.スクラッチでもサイエンスにせまれると思います.だけど,僕が言っているプログラミング言語の奥深さには全然迫れていないですね.LOGOより退化してますよね.

ちなみに,サイエンスアゴラのサイトでは,

http://www.jst.go.jp/csc/scienceagora/about/
 ここでいう「サイエンス」は、生命科学、理学・工学のほか、人文・社会科学までも含む広い意味で用いています。

と書かれてあるので,かなり広くとらえてよいと思います.開催側はそう考えているとしても,実際に出展しているガチガチの科学者たちにどう見られているかは別です.