赤間仁志さんのプラレールによる半加算器

F17bbe02fb6dda24d29196c2479121b1?s=47 Hidemi KAWAI
November 02, 2016
270

 赤間仁志さんのプラレールによる半加算器

F17bbe02fb6dda24d29196c2479121b1?s=128

Hidemi KAWAI

November 02, 2016
Tweet

Transcript

  1. 赤間仁志さんの プラレールによる半加算器 サイボウズ・ラボ株式会社 川合秀実

  2. おことわり • このスライド資料は主に川合が社内での説明の ために作ったもので、完成度がほどほどになって おります。すみません。 – 時間をかけていいものを作るよりも、早く概要をお知ら せすることを優先したためです。 • 資料内に出てくるプラレールの写真は、ver.1.0の

    もので、最新のver.1.1とは一部違っております。 • どうしても写真では分かりにくい部分があります。 それは是非実物で確認してください。 – [サイボウズ以外の方へ] 社外で展示することもありま すので、検索などで調べてみてください!
  3. 赤間仁志さんについて • 2015年度 サイボウズ・ラボユース生 – プログラミング言語を開発 – 川合が指導担当 • なぜプラレールをサイボウズ社内で?

    – ラボユース生の卒業プレゼントで、「広い社内で のびのびとプラレールする権利+レール購入費」 をプレゼントしたからです!
  4. 半加算器とは? • 2進数における足し算(2つの入力) 0 + 0 = 00 0 +

    1 = 01 1 + 0 = 01 1 + 1 = 10 ↑ こういう計算ができる仕組みが 「半加算器」と呼ばれる 入力A 入力B → 出力C 出力S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 ちなみに、3つの1ビットの入力から計算して、2ビットの和を算出する仕組みは 「全加算器」と呼ばれる
  5. プラレールとは? • タカラトミー製のおもちゃ • よくできている • 価格も手ごろ • とてもたのしい

  6. 0や1の表現方法 • どうやって0や1をプラレールで表現するか? – ターンアウトレール(ポイントレール)を使います 直進設定 → 0 を表す 曲がり設定

    → 1を表す
  7. その他の主要なレール部品(1) • 直線レール、曲線レール、坂レール

  8. その他の主要なレール部品(2) • 自動ターンアウトレール – 電池がなくても自動で交互に切り替わる優れモノ – 今回利用したレール部品としては、もっとも高価 – 2つのモードがある •

    自動: 電車が通るたびに切り替わる(曲→直→曲→直・・・) • 固定: あらかじめ設定した分岐方向をずっと維持する
  9. その他の主要なレール部品(3) • 改造ターンアウトレール – これは標準のレールとは違うものに見えるかもし れませんが、自動ターンアウトレールで固定モー ドにすれば同じ機能が得られます。今回はコスト 削減のために改造レールを利用しています。 左から入った場合は 必ず直進する

    右や右上から入る場合 は問題なく左へ抜ける
  10. 0や1を読み取る方法 • ターンアウトレールの上を電車が通って、進 行方向が変わることで、電車の挙動を変える 左から電車が入ると、0か1かによって どちらに進むかが変わる

  11. 0や1を書き込む方法 • 先ほどとは逆の方向からターンアウトレール に進入すると、ターンアウトレールの状態を 変えることができる 右から電車が入ると、0に設定される 右上から電車が入ると、1に設定される

  12. 今回の半加算器の仕様 • (1) AとBに、0か1をセット(人間が手でやる) • (2) スタート地点から電車を走らせる • (3) 電車があれこれと走る

    • (4) やがて電車はスタート地点に戻ってくる • (5) SやCが正しく計算されている! 入力A 入力B → 出力C 出力S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
  13. 半加算器の全景(ver.1.0)

  14. 半加算器の説明 下: A 上: B 下: C 上:S 下: スタート位置

    自動ターン アウトレール 3階建て-1 自動ターン アウトレール 3階建て-2 2階: X Y 2階: Z ここはお金が かかっていて かっこいい 自動ターンアウ トレールが6個も 並んでいる! XYZについて は後述
  15. 右上を拡大(ちなみに演算後) • 重要な部分が 集まっている場所 です 入力A(1階) 入力B(2階) 入A 入B →

    出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 出力C(1階) 出力S(2階) スタート位置 (1階)
  16. 記号の説明 • ターンアウトレールA, B, C, S – 入力・出力用のレール • ターンアウトレールX,

    Y, Z – 説明の便宜のための特別に名前を付けたレール
  17. A = 0 の場合(1) • (1) まず、電車 は図の経路を 通り、X=0にした あと、Aの場所

    に戻ってきます A(1階) X 自動ターンアウト レール-1 (2階) 電車の進行方向 スタート位置 ここから出発
  18. A = 0 の場合(2) • (2) 次に、電車 は図の経路を 通り、Y=0にした あと、Aの場所に

    戻ってきます A Y 自動-1(2階) 自動-2(2階) ここから出発
  19. A = 0 の場合(2) 補足 • なぜ(1)とは違う経路に行ったのですか? – 自動ターンアウトレールの向きが変わったからです

  20. A = 0 の場合(3) • (3) 次に、電車は 図の経路を通り、 再びX=0にした あと、Aの場所に

    戻ってきます A X 自動-1(2階) ここから出発
  21. A = 0 の場合(3) 補足 • なぜ X=0 を二度やるのですか? –

    本当は二度やる必要はないです – 自動ターンアウトレールが交互に切り替わるので、 やむを得ないのです
  22. A = 0 の場合(4) • (4) 次に、電車は 図の経路を通り、 Z=0にしたあと、 Bの場所へ行きま

    す(後半へ続く) A(1階) Z 自動-1(2階) 自動-2(2階) 2階 2階 3階 3階 2階 ここから出発 B(2階) 複雑なので実物を指で 追う方が分かりやすいです
  23. A = 1 の場合 • A=0の場合と同様に、X, Y, Zをそれぞれ1にして いきます –

    自動ターンアウトレールの1階を使うところが違い ます(A=0の場合は2階を使っていました) – A=0の場合と同様に、X=1は二度実行してしまいま す – 図を作るのが面倒なので、図は省略します(すみ ません!)
  24. ここまでのまとめ • A=0 の場合は、2階の2つの自動ターンアウト レールを通って、X=Y=Z=0になる • A=1 の場合は、1階の2つの自動ターンアウト レールを通って、X=Y=Z=1になる •

    つまり、X, Y, ZにはAの値がコピーされる • そして電車はBへ向かう
  25. B = 0 で A = 0 の場合 • (1)電車は図の

    経路を通り、Xの 値に応じて分岐 します ゆえにS=0になる そしてBの位置に 戻ります B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
  26. B = 0 で A = 1 の場合 • (1')電車は図の

    経路を通り、Xの 値に応じて分岐 します ゆえにS=1になり そしてBの位置に 戻ってきます B(2階) S(2階) X 自動-1(3階) ここから出発 これも複雑
  27. B = 0 の場合 • (2)電車は図の 経路を通り、C=0 になります そしてスタート 位置に戻ってき

    ます[終了] B(2階) C(1階) 自動-1(3階) ここから出発
  28. ここまでのまとめ • B=0の場合、Bの位置から出発して、2周します – 1周目はXを参照してSを計算 – 2周目は無条件にC=0にしに行く – Cに値を設定し終わると、 スタート位置へ帰って

    終了 • つまりB=0の場合は、Xしか見てません – YやZにもAの値をコピーしましたが使っていません • 自動-1(3階)だけを使います 入A 入B → 出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
  29. B = 1 の場合 • B = 1 の場合も同様に計算していきます –

    図は省略 – 1周目でSを計算(Yを参照) – 2周目でCを計算(Zを参照) – Cに値を設定し終わると、スタート位置へ帰って終了 • B=1の場合はXを参照しません – XにもAの値をコピーしましたが使っていません • 自動-2(3階)だけを使います 入A 入B → 出C 出S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0
  30. 考察(1) • ターンアウトレールの状態が0や1を表現します • 電車が通過する・しないは数を表現しません – 電車は「今はここの計算をしています」という「プロ グラム・カウンタ」を意味しています

  31. 考察(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)に行きます
  32. 考察(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入力へ)
  33. 考察(4) • 自動ターンアウトレールを使ったループ構造 自動 自動 スタート位置 1回目と3回目 2回目 4回目 ①

    ② ③ 自動ターンアウトレールは、あらかじめすべて直進状態で初期化しておく 自動ターンアウトレールは、「切り替わってから分岐する」ので、最初は曲がる 上図だと、①→②→①→③の順に電車が走る ③を抜けた時点で、自動ターンアウトレールはすべて直進状態に戻っている (Xの設定) (Yの設定) (Zの設定)
  34. 考察(5) • 合計すると4+6=10もの経路があり、しかもそ れらをうまく接続するために引き回しています • だから「たかが半加算器」なのに、こんなに複 雑で大規模なのです

  35. 考察(6) • X, Y, Zの原理(混線をさける仕組み) Xなど 改造レール 改造レール 改造レール ①から入るとXに0を書き込んで③へ抜けます

    ②から入るとXに1を書き込んで③へ抜けます ④から入るとXの値によって⑤か⑥へ分岐します (混線=読むときと書くときとで、経路が混ざってしまうこと)
  36. 考察(7) • 演算が終了するとスタート地点に戻ってくる • A, B, C, Sのすべてがスタート地点のそばにあ り、操作・確認しやすい •

    これらは赤間さんが意識して工夫したそうで す。さすがです。職人芸です。
  37. None
  38. 補足 • 考察(6)で「混線」を避ける必要があるのはな ぜか? – たとえば、Aの値がXにコピーされる – Sの値を計算するために、Xの値を逆走することで 参照するとき、もし混線をさける仕組みがなけれ ば、結局電車は単にA地点に戻る

    • Xの値が0か1であるかに関わりなく – 何もしないまま同じ場所に戻ってしまっては、Xの 値によって結果を変えることができない – それではSの計算なんてできない