ビスケットのあれこれ

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

ビスケットの計算幾科学的な解釈

2014-04-01 21:09:26 | 1
プログラミングは一言で言うとコンピュータに計算をさせる方法を伝えることである.

計算を伝える方法として,一番シンプルなのは,式を使うことである.コンピュータを動かすには動いて欲しい式をコンピュータに入れてやるのである.世界で最初のプログラミング言語FORTRANでは式をコンピュータが読める形式で書いた.その書き方は今でも様々な言語に影響を与えている.たとえば,ある数の二乗を計算させたいとすると, f(x) = x*x のように書く.

計算を伝える別の方法に,計算の例を教えるというものもある.

1が入力されたら1を返す.2が入力されたら4を返す.3が入力されたら9を返す.このように,計算して欲しい計算の具体例を示す.これは,二乗という概念や言葉を知らなかったり,x*xという式を知らなかった場合に使える.

自動プログラミング(コンピュータにプログラムを作らせる)の研究分野では,このような具体例からプログラムを自動生成する「例によるプログラミング PBE: Programming by Example」というのがある.入力と出力の組を幾つか与えて,f(x)=x*xという式を自動生成させるのである.古い研究ではあるが,生成できるときはできるし,難しい問題は全然できない.

さてビスケットはこのPBEに非常に近い動きをする.ただし式は生成せずに直接動く.特に例がたった一つでも動いてしまう.まず「1のときは1を返す」というのを教える.このとき「1の答えは?」という質問には1と答えられる.では「2の答えは?」に対してはたぶん2と答えるだろう.本当は4と答えて欲しかった.しかし「1.1の答えは?」に関しては1.1と答えるが,正しい答え(1.1*1.1 = 1.21)には(2と4の違いよりは)少し近い.教えた計算の例(1ならば1)に対して近い計算は近い答えが返る.

さて,もう少し進めて「2のときは4を返す」というのを二つ目の例として教える.すると,二つの質問「1の答えは?」と「2の答えは?」に関しては正確な答えがもらえる.しかし,「3の答えは?」に関しては多分5を返すであろう(2と3の差は1なので,その差を4に足して5になる).これも酷い間違えではあるが,最初の1つしか例を与えていなかったときに「3の答えは3である」と答えることから比べるとずいぶんマシになった.本当の答えは3*3で9である(実はビスケットでは線形にしか計算していないので,どんなに例を追加したところでx*xを完璧に再現することはできないのであるが).

このようにして,コンピュータに計算式を教えることなく,入力と出力の組だけを教えても計算をさせることができる.これがビスケットの計算の仕組みである.

ビスケットが対象にしているのは,数ではなく,絵の配置である.「絵と絵がこのように配置されていたときに,それをこのように配置し直す」という計算である.絵の並べ替えの方法ももちろん厳密な式で記述することができて,それをプログラムにすれば絵を動かすことができる.絵の配置を厳密に制御したい場合はこのようにするしかない.しかし,動かし方をもっと大雑把に伝えるので十分であれば,何も厳密な式など使わなくても,ビスケットの方法でよいだろう(ビスケットがまあまあ上手く行っているように見えるのは,絵の配置はパラメータが多く,式で表現するには複雑になることと,絵の配置で非線形な関数での並べ替えはあまりやらないからだろう).

関数の入力と出力の組を与えるというのは,関数の仕様を与えると言っても良い.伝統的なスタイルでは仕様が与えられて,それを満足する計算の手順を組み立てるのがプログラミングであると定義される.一方で近代的には,仕様からプログラムを自動生成したり,ビスケットのように仕様のままコンピュータが動いたりというのも存在する.その場合に,今度はコンピュータにわかるように仕様を与えることが上位のプログラミングと考えることができる.

ビスケットの目的は少なくとも伝統的なプログラミングの教育ではない.仕様から手順への変換スキルは不要である.それをすっとばして,仕様を考えることに専念できる.それによって,コンピュータとはどういうものかを体験で理解する,ということなのである.


プログラミング教育を色々なツールで教えている人たちはもう一度よく考えて欲しい.仕様から手順への変換スキルを身につけさせたいのか,よい仕様を考えるスキルを身につけさせたいのか.