計算の双方向性

情報は単方向です.たとえば,AさんはBさんの自宅の住所を知っています.住所はもちろん情報です.で,AさんがBさんの住所を知っているからといって,BさんがAさんの自宅の住所を知っていることにはなりません.これはまた別の話です.つまり,情報では単方向を2つ組み合わせて双方向を作っているということになります.

なにを当たり前のことを言っているんだ,と思われるかもしれませんが.実は物理は双方向です.たとえばAさんとBさんが手をつなぎました.物理的な接触です.AさんがBさんと手をつないでいるということは,BさんがAさんと手をつないでいるということです.AさんがBさんにバレないようにBさんと手を繋ぐことはできません.どうあがいても双方向なのです.

作用と反作用というのを習いましたよね.物を手で押すということは,手は物から押されているということです.

そう思うと,物理と情報とが全然ちがうことがわかりますよね.別にインターネットがどうとかじゃなくて,郵便の住所のレベルですでに情報の性質満々なわけですよ.

で,話題は計算の方です.計算は単方向か双方向か.これはどっちでも言えますね.Aに5を足したらBになる.ということは,Bから5を引いたらAになりますよね.A+5=Bというのは足し算に見えるけれど,解釈によっては引き算でもあるということです.

一方,プログラミングにおける計算は残念ながら単方向なんですね.式は

B=A+5

と書かなければなりません.で,A+5を計算した答えをBに入れるという解釈をします.たとえば,Bを11にしたいんだけどそのためにはAは何にすればいいかな,といったことは自動的にはやってくれません.

ところが,そういう双方向の計算をするプログラミング言語があるんですね.それを最初にみたときは度肝を抜かれました.

Prologという言語です.聞いたことある人もいるかもしれません.Prologは30年くらい前のときの人工知能ブームで流行った言語です.で実際に,Prologで足し算のプログラムを書いたら,そのまま引き算としても動きます.

こんな感じです.数は2進法でビットの並びを逆順にしてリストで表します.上の例は[0,1]というのは10で,10+10=100です.でつぎは100-10=というのを計算してまして,010と10という答えをだしてます.たぶん,もうちょっとうまいやり方でやると答えが1つにできるんじゃないかと思いますが.うえのプログラムは1桁の足し算の計算を回路を繋ぐようにしてプログラムを書いているだけなんです.

Prologをこんな風に使う人はあまりいないと思いますが,僕は30年くらい前はこんなプログラムを書いて,それを逆に動かしたら答えがちゃんとでるかどうか遊んでました.

なんで,こんな話を突然しだしたかというと,友人の投稿で,モーターを手で回したら発電機になる,というのを見てです.何にも考えないでも物理はちゃんと逆向きに動くんですよね.それで,ビスケットで逆向きの計算はできないのかなと思いまして.できないとすると何が足りないのか.

ビスケットは逆向きの計算は非常に考えやすいですね.なんせ,メガネは左右対称ですからね.ちょっと違うのはタッチと音がそれぞれ左と右にしか入れられないということで,非対称なのはその程度ですから.タッチがないメガネでどんなことが起こるか考えてみましょう.

あるステージの状態Aがあって,メガネの集合Gがあって,何ステップか実行したらあるステージの状態Bになった.で,各メガネの左右を入れ替えた集合をGRをつくって,BからスタートしたらAになるかってことですね.

まず自明なのは,ランダムや衝突や増殖がないメガネだけの場合.動くのはまっすぐか回転しかないので,メガネを逆にしたら逆になります.これはやらなくてもわかる.

お化けのゆらゆらのようにランダムが入ると,その左右逆のメガネもランダムになりますから,Aからスタートして何ステップか実行するといろんなBの可能性のどれかになります.そのどのBからとっても逆に動かすといろんな可能性のAになりますがそのなかには必ず最初のAが含まれていると.それ以上のことはあまり言えないので,ランダムを考えてもあんまり面白くないですね.

衝突はどうなるかやってみました.

上の2つのメガネは,三角が上に進んで,三角と丸とぶつかったら,丸を上に突き飛ばして三角は少し下にずれるというもので,三角が丸をドリブルしているかのような動きになります.では逆はということ,わかりやすいように絵に(’)ダッシュをつけてみました.三角ダッシュは下に下がる.三角ダッシュと丸ダッシュがこれくらいの距離で離れてたらひゅっと真ん中に集まる,ということになります.動きはちゃんと逆の動きになりました.まあそうですかね.録画して逆再生したら同じになるでしょうね.

絵が増えたり減ったりするような場合は,正向きはランダムじゃないのに,逆向きでランダムになったりしたりで,こんな綺麗には行かなそうですね.

まあ,こんな変なことを考えることで,プログラミング言語自身の拡張のヒントを探しているんです.

シェアする

  • このエントリーをはてなブックマークに追加

フォローする