Comments
Transcript
ビスケットへの絵の継承の導入 Viscuit with Picture Inheritance
ビスケットへの絵の継承の導入 Viscuit with Picture Inheritance 原田 康徳† ビスケットは柔軟なマッチングを導入した,図形配置書き換え型ビジュアル言語である.書き換えは一定 間隔で連続して行われるため,図形配置が連続して変化し,実行結果はアニメーションとなる.柔軟な マッチングにより,図形の配置が厳密に一致していない場合でも柔軟に書き換える.その結果,単純な書 き換え規則でも表現力の高いアニメーションが得られる.そのビスケットに,新たに図形の継承を導入す る.図形 A が図形 B を継承することで,図形 B として定義されていた書き換え規則はすべて図形 A として も使用できるようになる.実装は,書き換え規則を図形 B から図形 A に置き換えたものを自動生成するこ とで,実行される.単純で強力な実装の結果,グループを用いた継承,多重継承,条件付継承などを自然 に表現できるようになる. 1.はじめに な配置も考慮して書き変えられる.図の上のメガネは, ビスケット 1)は,子どもやコンピュータの専門 矢印が上にずれるように書き換える規則である.書き 家ではない人に,コンピュータプログラミング 換えは一定間隔で連続して行われるため,矢印は の楽しさを体験してもらうために作られた,ビ まっすぐ進むアニメーションになる.下のメガネは,矢 ジュアルプログラミング言語である.文部科学 印が丸にぶつかりそうになると,よける,という書き換 省のサイトに登場した「プログラミン」という えである.複数の図形があるとき,それらの配置は厳 ビジュアルプログラミング言語があるが,単に 密に一致しなくても,その配置のずれを考慮して書き プログラミングそのものを楽しく経験できれば 換えが行われる.相対的な配置が厳密に一致した場 よいというだけでなく,コンピュータが持つ底 知れない力を直感的に感じてもらえるようにビ 合は指示された通りに,相対的な配置がずれている スケットは設計されている.そのため,非常に 場合はそのずれが大きいほど,書き換えの結果も指 少ないプリミティブしかなく,その組み合わせ 示されたものからずれる. 方の工夫で様々な応用ができる,という点を重 視している. 図2絵の継承(ゆきだるま) 2.ビスケットの継承 新たに導入した継承は縦に並んだ2つの円で表現 する(図2).我々はこれを,「ゆきだるま」と呼んでい 図1ビスケットの書き換え規則(めがね)と実行例 る.下の円に入れられた絵は上の円に入れられた絵 ビスケットの例を示す.図1は右側が書き換え と同じ動きをする.ロケットは矢印の動きを継承する. 規則,左側が書き換え対象である.書き換え規則は そこでロケットは,矢印と同じようにまっすぐすすんで, その形状から「めがね」と呼ばれている.めがねは左 丸にぶつかりそうになるとよける動きをする. 側にある絵を右側の絵に書き換える規則を示してい ゆきだるまによる継承の指示は,単に絵の種類の る.絵の種類だけじゃなく,めがねの中の絵の相対的 情報だけでなく,絵の相対的な位置関係も重要であ る. † NTT コミュニケーション科学基礎研究所 第52回プログラミング [email protected] シンポジウム 2011.1 89 複数の絵を特定に配置させたものを一つの絵とし て扱いたい場合がある.これを継承で表現する. 図3継承で相対的配置が影響する例(間違い) 図3のようなゆきだるまは,思ったような車の動きを 図6らくだと人の例 してくれない.本当は車は絵の進行方向(左)に進 んでほしいが,車は上にすすんでしまう.ビスケット は絵の持っている本来の意味は知らない.車の絵が 図6では2つの絵,らくだと人に対してめがねが定義 どっちに進むべきかは自動的にわかるはずはなく,ロ されている(図中央の2つのめがね).それぞれ, らくだは後ろ向きに回転する.人はゆっくりと前にす ケットの絵と同じように上に動いてしまうのである. すむ,という意味である.図右のゆきだるまでは,らく だに人が乗った状態で,矢印と同じように動く,と定 義されている.人とらくだが単独でいるときは,それぞ れの動きをするが,何かの偶然でそれらの絵が重な ると,まっすぐ進みだし,障害物に当たったらよけるよ うになる. 4.継承の実装 図4継承で相対的配置が影響する例(正解) 図7継承の実装 図7の左側のようなめがねとゆきだるまがあったとき, 図5継承で相対的配置が影響する例(別の正解) システムは図右のようなめがねを自動生成する.生 成方法は以下のとおり. 正しく車を動かしたい場合には,図4のように,ゆき 1)すべてのゆきだるまに対して, だるまの中の車を上向きに置く.これによって,車は 2)ゆきだるまの上にある絵 A を含んでいるすべ 進行方向に進むようになるし,丸にぶつかってもよけ てのめがねを集める. るようになる. 3)そのめがねの左右それぞれに対して,絵 A を ゆきだるまで重要な情報は,絵の相対的な配 ゆきだるまの下にある絵の組で置き換えた新しい 置であるので,図5のように,矢印のほうを左 めがねを作成し追加する. に向けてゆきだるまを作っても良い.むしろこ 4)追加されためがねに対して,1)から3)を実行 ちらのほうがわかりやすいかもしれない. し,新たに追加されるめがねが無くなるまで繰り返 す. 3.絵のグループ化 90 第52回プログラミング シンポジウム 2011.1 継承が多段であっても,このアルゴリズムは動作す る. ビスケットの実装では,何かのめがねかゆきだるま を修正するごとに,この自動生成を行っている.ただ し,非常に無謀な継承をされた場合に備えて,自動 生成できる個数に上限を設けている.上限に達する ような自動生成が行われる場合というのは,あまり ちゃんと設計されておらず,グチャグチャに使われ ていることがほとんどなので,生成が不完全であって も,その動作がおかしいと気づくことはまずない.完 全な動作よりは,グチャグチャな操作でも重くならず に動作する,という点を重視している. 5.継承の応用 5.1 多重継承 図9キーパッドの例 人は矢印の動きを継承するという意味になる.実装で は,矢印が含まれているめがねを,人と1ボタンの組 で置き換えるだけである.ボタンなどのセンサーはめ がねの左側(条件側)に入れることになっている.この 単純な置き換えによる実装では,めがねの右側(アク ション側)にある矢印も1ボタンと人に置き換えてしま うため,右側にもセンサー命令を入れてしまうことに なるが,無視される. 同様に,音を出すなどの,めがねの右側(アクショ ン側)に入れる特殊命令がある.これを継承に含める ことは可能である.この場合もめがねの左側にも入れ られてしまう可能性があるがそれは無視される. 現在のビスケットのセンサーとしては,まだキーバッ 図8多重継承の例 ドくらいしかないが,光センサーといった物理的なセ ンサーや,Web 上のリソースを用いた条件式(例:天 車とロケットは,丸(障害物)を継承する.図1,図2, 気が晴れなら)などもセンサーとして拡張可能である. 図4とこの例をあわせると,車やロケットは矢印のよう これらのセンサーによる条件が真の時だけ継承が有 に動くだけでなく,障害物としても認識され,車やロ 効というのは,非常に面白い応用が可能であろう. ケットに当たるとよけるという動作もする.この2つの多 重継承の結果,組み合わせ的に非常に多くのめが 6.議論 ねが自動生成される.矢印が丸にぶつかる,というめ これが子どもに受け入れられるかどうか.我々が, がねを種にして,矢印と丸をそれぞれロケットや車な 子どもにビスケットを教えるときの基本的な方針は, どの絵に置き換えた組み合わせで生成する.車とロ 彼らが必要とするまでは与えない,ということである. ケットが継承しただけで 3x3 で9個のめがね(つまり8 ただし 100% 求められるまで教えないやりかただと, 進歩が非常に遅いので,新しいことを少しだけみせる つ生成)になる. 多重継承など,複雑な継承を行うと,生成されため ことは見せるが.それもあまり急激なジャンプはさせな がねに矛盾が生じる可能性がある.しかし,ビスケット いように気をつけている.時間の制約などで,無理や の処理系は書き換えの都度,もっともマッチングの評 り難しいことを教える場合もあるが,大体失敗している. 価関数が高いものを選択して書き換えるので,矛盾 その場は真似はするけど,彼らが必要としていないこ とであれば,すぐに忘れてしまうからである. があったとしても問題はない. そういった方針からすると,この「ゆきだるま」は,あ 5.2 センサーとアクション ビスケットの機能として,キーバッドを使った制御の る程度複雑なプログラムを作った子が,それをもっと 機能がある.図9のめがね(図上)はキーパッド(左ボ すっきりとさせたいという要求が出たときに教えられる, タン)を押している間だけ有効で,矢印が回転すると ということになる. いう意味である. 図9のゆきだるま(図右)は,1ボタンを押している間,6.1 子どもが作った例 たとえば,図10のようなシューティングゲームを作っ 第52回プログラミング シンポジウム 2011.1 91 図10 中2が作成したシューティングゲーム(敵と砲は2色で,右か左に動いて見えない壁にぶ つかると,反対の色になる.これによって左右に往復する.砲は1ボタンで弾を発射し,敵は弾に 当たると消える.敵と砲がぶつかると「負け」になる) 図11 著者が改良した継承を利用したシューティングゲーム 92 第52回プログラミング シンポジウム 2011.1 図12抽象クラスを使わない方法 (うまく動かないかもしれない) た中2の子がいた.敵の絵は2種類,砲の絵も2種類 著者が改良したプログラムである.ここで,敵と砲は あり,それぞれ左右に自動的に動く.ボタン 1 を押す 抽象的な図形に対して動きを定義し,それを継承す ことで弾が発射し,敵を倒す.敵に砲がぶつかると終 るようにしている.これは図10と同じ動作をする. わりである.最初,自分で砲を左右にコントロールで しかし,抽象クラスを用いずに,敵や砲のどちらか きるようにしていたが,あまりにもゲームが簡単すぎた の色で主の動きを定義し,それをもう一方の色が継 ので,砲の動きも自動化して,弾を発射するタイミン 承するようにするとどうなるだろうか(図12).青の砲 グだけコントロールできるように,制約をもたせてゲー は左に,ピンクの砲は右に動くようになっている.しか し,たとえば,青の砲で全体の動きをつくり,ピンクの ムの難易度を上げている. 砲がそれを継承するようにすると,ピンクの移動のめ 砲と敵が左右に動くとき,絵の色を状態として作っ がねは左に動くものと,右に動くものの両方ができて ている.画面の左右には,透明な壁の絵を置き,そこ しまう.2つのめがねの左側の絵が同じものの場合, にぶつかると方向を変えるという仕掛けがある.弾を それぞれの絵の絶対角度が異なると,書き換え対象 発射,弾と敵が当たると爆発,敵と砲が当たると負け,の絵の絶対角度と比較して,角度が近いほうのめが の部分は,動いている方向に関係ない処理であるが,ねが使用される.角度がまったく同じであれば,どち 状態を色で示しているため,プログラムを見てわかる らのめがねが実行されるかわからない.図12は,元 ように,似たようなめがねが並んでいる. のプログラムの角度がしっかりと作られていたため, これくらいなプログラムを作った子にゆきだるまの機 自動生成されためがねの角度も正確に同じ向きにな 能を提供できれば,プログラムをすっきりとさせられる り,正しく動くかどうかわからない. だけでなく,より複雑な継承の応用に発展したであろ 一般的なオブジェクト指向では,スーパークラスのメ う.この時点ではゆきだるまはまだ実装されていな ソッドをサブクラスで上書き(override)することで,スー かった. パークラスの動作を完全に消すことができる.しかし 図11は抽象クラスを用いてゆきだるまを使用した, ビスケットの継承では,すべて残して継承してしまうた 第52回プログラミング シンポジウム 2011.1 93 め,矛盾した動きも残ってしまい,このような問題が生 しかし,マッチングは有限であるため,生成を じる.つまり,いまの実装では,図11をつくらなけれ 事前に行うのではなく,書き換えのタイミング ばダメなのである.このような,図11と図12の違いを で継承をたどりながらパターンマッチをするよ うな実装ができれば,循環を許した継承の実装 子どもが理解して使用できるとは思えない. は可能である. この問題を解決するために,すでに継承前の絵に これは,形式文法の2次元版に発展する. 対してめがねが定義されているときには,継承によっ て自動生成されるめがねに制約を与える,という仕様 6.3 絵の対象性の定義 がよいのかもしれない.つまり,生成しようと思ってい 図14のような線路と電車の例がある.一般的な印 るめがねの左側のパターンと近いめがねがすでに定 象として線路はどちらの向きでも電車を走らせること 義されていたら,生成しないというものである.ここで ができると思うだろう.しかしこの例では線路には方 「近い」という点がビスケットらしい仕様だと思う. 向があるので,反対向きに電車を置いても進まない. そのためには,線路の反対向きでも電車が進むとい 6.2 再帰的構造の定義 うめがねが必要である. 以下は,今回のビスケットの拡張では禁止さ れているが,それを許すとしたら,という仮定 の話である. 図15 線路に対象性を与える 図15のように正確に180度に回転させた線路を継承 させることができるようにする.これは,線路は反対向 きでも同じ,という意味になる.重要な点は線路が正 確に180度に回転していることである. この論文の執筆時点では,実際のワークショップの 現場で,まだ子どもに対してゆきだるまを教えてはい 図13再帰的な形の定義 ない.かなりレベルの高い子でも,ゆきだるまが必要 性を理解できるようになるためには,時間が必要であ 図13は,継承で上と下で同じ絵が使われてい る例である.現状のビスケットでは継承の木で る.まずは,すべての組み合わせが衝突するケース 循環は禁止しているので,それが生じた場合は を抜けがなく列挙できるようになって,それを完璧にり かいできるようになってから,ゆきだるまを教えるべき この図のように×のマークが示される.ここでは, 仮にこの循環を許したとしよう.この例は,木 であろう. を3つ下の円のように配置した図形は,一つの 図9のような条件付きの継承は2)3)の影響を受け 木と同じである,と定義している.再帰的な図 ている. 形配置である.図の左側にあるような配置をし た木のグループは一つの木と同じ動きをする. まとめ 現状の実装では,継承によってめがねをあら 新しく書き換え規則を自動生成して動作する継承に かじめ自動生成して,それから実行する,とい ついて述べた. う方法をとっているため,このような循環した 定義は自動生成を停止させることができない. 参考文献 図14 線路と電車の例 94 1) Yasunori Harada, Richard Potter : Fuzzy Rewriting -- Soft Program Semantics for Children --, HCC 2003, IEEE. 2) Yasunori Harada, Kenichi Yamazaki, Richard Potter: CCC: User-Defined Object Structure in C. ECOOP 2001: 118-129 3) 原田康徳, 山崎憲一: CCC --データの内部表現に依存 しないオブジェクト指向,情報処理学会論文誌:プログラミング, Vol.42, No.SIG2(PRO 9), pp. 48-60 (2001). 第52回プログラミング シンポジウム 2011.1