赤間仁志さんのプラレールによる半加算器サイボウズ・ラボ株式会社川合秀実
View Slide
おことわり• このスライド資料は主に川合が社内での説明のために作ったもので、完成度がほどほどになっております。すみません。– 時間をかけていいものを作るよりも、早く概要をお知らせすることを優先したためです。• 資料内に出てくるプラレールの写真は、ver.1.0のもので、最新のver.1.1とは一部違っております。• どうしても写真では分かりにくい部分があります。それは是非実物で確認してください。– [サイボウズ以外の方へ] 社外で展示することもありますので、検索などで調べてみてください!
赤間仁志さんについて• 2015年度 サイボウズ・ラボユース生– プログラミング言語を開発– 川合が指導担当• なぜプラレールをサイボウズ社内で?– ラボユース生の卒業プレゼントで、「広い社内でのびのびとプラレールする権利+レール購入費」をプレゼントしたからです!
半加算器とは?• 2進数における足し算(2つの入力)0 + 0 = 000 + 1 = 011 + 0 = 011 + 1 = 10↑ こういう計算ができる仕組みが「半加算器」と呼ばれる入力A 入力B → 出力C 出力S0 0 0 00 1 0 11 0 0 11 1 1 0ちなみに、3つの1ビットの入力から計算して、2ビットの和を算出する仕組みは「全加算器」と呼ばれる
プラレールとは?• タカラトミー製のおもちゃ• よくできている• 価格も手ごろ• とてもたのしい
0や1の表現方法• どうやって0や1をプラレールで表現するか?– ターンアウトレール(ポイントレール)を使います直進設定 → 0 を表す曲がり設定 → 1を表す
その他の主要なレール部品(1)• 直線レール、曲線レール、坂レール
その他の主要なレール部品(2)• 自動ターンアウトレール– 電池がなくても自動で交互に切り替わる優れモノ– 今回利用したレール部品としては、もっとも高価– 2つのモードがある• 自動: 電車が通るたびに切り替わる(曲→直→曲→直・・・)• 固定: あらかじめ設定した分岐方向をずっと維持する
その他の主要なレール部品(3)• 改造ターンアウトレール– これは標準のレールとは違うものに見えるかもしれませんが、自動ターンアウトレールで固定モードにすれば同じ機能が得られます。今回はコスト削減のために改造レールを利用しています。左から入った場合は必ず直進する右や右上から入る場合は問題なく左へ抜ける
0や1を読み取る方法• ターンアウトレールの上を電車が通って、進行方向が変わることで、電車の挙動を変える左から電車が入ると、0か1かによってどちらに進むかが変わる
0や1を書き込む方法• 先ほどとは逆の方向からターンアウトレールに進入すると、ターンアウトレールの状態を変えることができる右から電車が入ると、0に設定される右上から電車が入ると、1に設定される
今回の半加算器の仕様• (1) AとBに、0か1をセット(人間が手でやる)• (2) スタート地点から電車を走らせる• (3) 電車があれこれと走る• (4) やがて電車はスタート地点に戻ってくる• (5) SやCが正しく計算されている!入力A 入力B → 出力C 出力S0 0 0 00 1 0 11 0 0 11 1 1 0
半加算器の全景(ver.1.0)
半加算器の説明下: A 上: B下: C 上:S下: スタート位置自動ターンアウトレール3階建て-1自動ターンアウトレール3階建て-22階: XY2階: Zここはお金がかかっていてかっこいい自動ターンアウトレールが6個も並んでいる!XYZについては後述
右上を拡大(ちなみに演算後)• 重要な部分が集まっている場所です入力A(1階)入力B(2階)入A 入B → 出C 出S0 0 0 00 1 0 11 0 0 11 1 1 0出力C(1階)出力S(2階)スタート位置(1階)
記号の説明• ターンアウトレールA, B, C, S– 入力・出力用のレール• ターンアウトレールX, Y, Z– 説明の便宜のための特別に名前を付けたレール
A = 0 の場合(1)• (1) まず、電車は図の経路を通り、X=0にしたあと、Aの場所に戻ってきますA(1階)X自動ターンアウトレール-1 (2階)電車の進行方向スタート位置ここから出発
A = 0 の場合(2)• (2) 次に、電車は図の経路を通り、Y=0にしたあと、Aの場所に戻ってきますAY自動-1(2階)自動-2(2階)ここから出発
A = 0 の場合(2) 補足• なぜ(1)とは違う経路に行ったのですか?– 自動ターンアウトレールの向きが変わったからです
A = 0 の場合(3)• (3) 次に、電車は図の経路を通り、再びX=0にしたあと、Aの場所に戻ってきますAX自動-1(2階)ここから出発
A = 0 の場合(3) 補足• なぜ X=0 を二度やるのですか?– 本当は二度やる必要はないです– 自動ターンアウトレールが交互に切り替わるので、やむを得ないのです
A = 0 の場合(4)• (4) 次に、電車は図の経路を通り、Z=0にしたあと、Bの場所へ行きます(後半へ続く)A(1階)Z自動-1(2階)自動-2(2階)2階2階3階3階2階ここから出発B(2階)複雑なので実物を指で追う方が分かりやすいです
A = 1 の場合• A=0の場合と同様に、X, Y, Zをそれぞれ1にしていきます– 自動ターンアウトレールの1階を使うところが違います(A=0の場合は2階を使っていました)– A=0の場合と同様に、X=1は二度実行してしまいます– 図を作るのが面倒なので、図は省略します(すみません!)
ここまでのまとめ• A=0 の場合は、2階の2つの自動ターンアウトレールを通って、X=Y=Z=0になる• A=1 の場合は、1階の2つの自動ターンアウトレールを通って、X=Y=Z=1になる• つまり、X, Y, ZにはAの値がコピーされる• そして電車はBへ向かう
B = 0 で A = 0 の場合• (1)電車は図の経路を通り、Xの値に応じて分岐しますゆえにS=0になるそしてBの位置に戻りますB(2階)S(2階)X自動-1(3階)ここから出発これも複雑
B = 0 で A = 1 の場合• (1')電車は図の経路を通り、Xの値に応じて分岐しますゆえにS=1になりそしてBの位置に戻ってきますB(2階)S(2階)X自動-1(3階)ここから出発これも複雑
B = 0 の場合• (2)電車は図の経路を通り、C=0になりますそしてスタート位置に戻ってきます[終了]B(2階)C(1階)自動-1(3階)ここから出発
ここまでのまとめ• B=0の場合、Bの位置から出発して、2周します– 1周目はXを参照してSを計算– 2周目は無条件にC=0にしに行く– Cに値を設定し終わると、スタート位置へ帰って 終了• つまりB=0の場合は、Xしか見てません– YやZにもAの値をコピーしましたが使っていません• 自動-1(3階)だけを使います入A 入B → 出C 出S0 0 0 00 1 0 11 0 0 11 1 1 0
B = 1 の場合• B = 1 の場合も同様に計算していきます– 図は省略– 1周目でSを計算(Yを参照)– 2周目でCを計算(Zを参照)– Cに値を設定し終わると、スタート位置へ帰って終了• B=1の場合はXを参照しません– XにもAの値をコピーしましたが使っていません• 自動-2(3階)だけを使います入A 入B → 出C 出S0 0 0 00 1 0 11 0 0 11 1 1 0
考察(1)• ターンアウトレールの状態が0や1を表現します• 電車が通過する・しないは数を表現しません– 電車は「今はここの計算をしています」という「プログラム・カウンタ」を意味しています
考察(2)• SやCの計算に当たっては、全く別の4つの経路が用意されています– (1) B=0の時のS計算用の経路– (2) B=0の時のC計算用の経路(C=0に固定)– (3) B=1の時のS計算用の経路– (4) B=1の時のC計算用の経路• B入力のターンアウトレールによって(1)&(2)か、(3)&(4)に行くかを最初に振り分けています• その後、3階の自動ターンアウトレールによって1周目に(1)か(3)、2周目に(2)か(4)に行きます
考察(3)• A入力を読み取るループでは、X,Y,Zに値を コピーするだけで、SやCの計算はしていません• コピーのための6つの経路があります– (1) X=0にするための経路– (2) Y=0にするための経路– (3) Z=0にするための経路(&終わったらB入力へ)– (4) X=1にするための経路– (5) Y=1にするための経路– (6) Z=1にするための経路(&終わったらB入力へ)
考察(4)• 自動ターンアウトレールを使ったループ構造自動 自動スタート位置1回目と3回目2回目4回目①②③自動ターンアウトレールは、あらかじめすべて直進状態で初期化しておく自動ターンアウトレールは、「切り替わってから分岐する」ので、最初は曲がる上図だと、①→②→①→③の順に電車が走る③を抜けた時点で、自動ターンアウトレールはすべて直進状態に戻っている(Xの設定)(Yの設定)(Zの設定)
考察(5)• 合計すると4+6=10もの経路があり、しかもそれらをうまく接続するために引き回しています• だから「たかが半加算器」なのに、こんなに複雑で大規模なのです
考察(6)• X, Y, Zの原理(混線をさける仕組み)Xなど改造レール 改造レール改造レール①から入るとXに0を書き込んで③へ抜けます②から入るとXに1を書き込んで③へ抜けます④から入るとXの値によって⑤か⑥へ分岐します(混線=読むときと書くときとで、経路が混ざってしまうこと)
考察(7)• 演算が終了するとスタート地点に戻ってくる• A, B, C, Sのすべてがスタート地点のそばにあり、操作・確認しやすい• これらは赤間さんが意識して工夫したそうです。さすがです。職人芸です。
補足• 考察(6)で「混線」を避ける必要があるのはなぜか?– たとえば、Aの値がXにコピーされる– Sの値を計算するために、Xの値を逆走することで参照するとき、もし混線をさける仕組みがなければ、結局電車は単にA地点に戻る• Xの値が0か1であるかに関わりなく– 何もしないまま同じ場所に戻ってしまっては、Xの値によって結果を変えることができない– それではSの計算なんてできない