$30 off During Our Annual Pro Sale. View Details »

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

Hidemi KAWAI
November 02, 2016
510

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

Hidemi KAWAI

November 02, 2016
Tweet

Transcript

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

    View Slide

  2. おことわり
    • このスライド資料は主に川合が社内での説明の
    ために作ったもので、完成度がほどほどになって
    おります。すみません。
    – 時間をかけていいものを作るよりも、早く概要をお知ら
    せすることを優先したためです。
    • 資料内に出てくるプラレールの写真は、ver.1.0の
    もので、最新のver.1.1とは一部違っております。
    • どうしても写真では分かりにくい部分があります。
    それは是非実物で確認してください。
    – [サイボウズ以外の方へ] 社外で展示することもありま
    すので、検索などで調べてみてください!

    View Slide

  3. 赤間仁志さんについて
    • 2015年度 サイボウズ・ラボユース生
    – プログラミング言語を開発
    – 川合が指導担当
    • なぜプラレールをサイボウズ社内で?
    – ラボユース生の卒業プレゼントで、「広い社内で
    のびのびとプラレールする権利+レール購入費」
    をプレゼントしたからです!

    View Slide

  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ビットの和を算出する仕組みは
    「全加算器」と呼ばれる

    View Slide

  5. プラレールとは?
    • タカラトミー製のおもちゃ
    • よくできている
    • 価格も手ごろ
    • とてもたのしい

    View Slide

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

    View Slide

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

    View Slide

  8. その他の主要なレール部品(2)
    • 自動ターンアウトレール
    – 電池がなくても自動で交互に切り替わる優れモノ
    – 今回利用したレール部品としては、もっとも高価
    – 2つのモードがある
    • 自動: 電車が通るたびに切り替わる(曲→直→曲→直・・・)
    • 固定: あらかじめ設定した分岐方向をずっと維持する

    View Slide

  9. その他の主要なレール部品(3)
    • 改造ターンアウトレール
    – これは標準のレールとは違うものに見えるかもし
    れませんが、自動ターンアウトレールで固定モー
    ドにすれば同じ機能が得られます。今回はコスト
    削減のために改造レールを利用しています。
    左から入った場合は
    必ず直進する
    右や右上から入る場合
    は問題なく左へ抜ける

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  13. 半加算器の全景(ver.1.0)

    View Slide

  14. 半加算器の説明
    下: A 上: B
    下: C 上:S
    下: スタート位置
    自動ターン
    アウトレール
    3階建て-1
    自動ターン
    アウトレール
    3階建て-2
    2階: X
    Y
    2階: Z
    ここはお金が
    かかっていて
    かっこいい
    自動ターンアウ
    トレールが6個も
    並んでいる!
    XYZについて
    は後述

    View Slide

  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階)

    View Slide

  16. 記号の説明
    • ターンアウトレールA, B, C, S
    – 入力・出力用のレール
    • ターンアウトレールX, Y, Z
    – 説明の便宜のための特別に名前を付けたレール

    View Slide

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

    View Slide

  18. A = 0 の場合(2)
    • (2) 次に、電車
    は図の経路を
    通り、Y=0にした
    あと、Aの場所に
    戻ってきます
    A
    Y
    自動-1(2階)
    自動-2(2階)
    ここから出発

    View Slide

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

    View Slide

  20. A = 0 の場合(3)
    • (3) 次に、電車は
    図の経路を通り、
    再びX=0にした
    あと、Aの場所に
    戻ってきます
    A
    X
    自動-1(2階)
    ここから出発

    View Slide

  21. A = 0 の場合(3) 補足
    • なぜ X=0 を二度やるのですか?
    – 本当は二度やる必要はないです
    – 自動ターンアウトレールが交互に切り替わるので、
    やむを得ないのです

    View Slide

  22. A = 0 の場合(4)
    • (4) 次に、電車は
    図の経路を通り、
    Z=0にしたあと、
    Bの場所へ行きま
    す(後半へ続く)
    A(1階)
    Z
    自動-1(2階)
    自動-2(2階)
    2階
    2階
    3階
    3階
    2階
    ここから出発
    B(2階)
    複雑なので実物を指で
    追う方が分かりやすいです

    View Slide

  23. A = 1 の場合
    • A=0の場合と同様に、X, Y, Zをそれぞれ1にして
    いきます
    – 自動ターンアウトレールの1階を使うところが違い
    ます(A=0の場合は2階を使っていました)
    – A=0の場合と同様に、X=1は二度実行してしまいま

    – 図を作るのが面倒なので、図は省略します(すみ
    ません!)

    View Slide

  24. ここまでのまとめ
    • A=0 の場合は、2階の2つの自動ターンアウト
    レールを通って、X=Y=Z=0になる
    • A=1 の場合は、1階の2つの自動ターンアウト
    レールを通って、X=Y=Z=1になる
    • つまり、X, Y, ZにはAの値がコピーされる
    • そして電車はBへ向かう

    View Slide

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

    View Slide

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

    View Slide

  27. B = 0 の場合
    • (2)電車は図の
    経路を通り、C=0
    になります
    そしてスタート
    位置に戻ってき
    ます[終了]
    B(2階)
    C(1階)
    自動-1(3階)
    ここから出発

    View Slide

  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

    View Slide

  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

    View Slide

  30. 考察(1)
    • ターンアウトレールの状態が0や1を表現します
    • 電車が通過する・しないは数を表現しません
    – 電車は「今はここの計算をしています」という「プロ
    グラム・カウンタ」を意味しています

    View Slide

  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)に行きます

    View Slide

  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入力へ)

    View Slide

  33. 考察(4)
    • 自動ターンアウトレールを使ったループ構造
    自動 自動
    スタート位置
    1回目と3回目
    2回目
    4回目



    自動ターンアウトレールは、あらかじめすべて直進状態で初期化しておく
    自動ターンアウトレールは、「切り替わってから分岐する」ので、最初は曲がる
    上図だと、①→②→①→③の順に電車が走る
    ③を抜けた時点で、自動ターンアウトレールはすべて直進状態に戻っている
    (Xの設定)
    (Yの設定)
    (Zの設定)

    View Slide

  34. 考察(5)
    • 合計すると4+6=10もの経路があり、しかもそ
    れらをうまく接続するために引き回しています
    • だから「たかが半加算器」なのに、こんなに複
    雑で大規模なのです

    View Slide

  35. 考察(6)
    • X, Y, Zの原理(混線をさける仕組み)
    Xなど
    改造レール 改造レール
    改造レール
    ①から入るとXに0を書き込んで③へ抜けます
    ②から入るとXに1を書き込んで③へ抜けます
    ④から入るとXの値によって⑤か⑥へ分岐します
    (混線=読むときと書くときとで、経路が混ざってしまうこと)

    View Slide

  36. 考察(7)
    • 演算が終了するとスタート地点に戻ってくる
    • A, B, C, Sのすべてがスタート地点のそばにあ
    り、操作・確認しやすい
    • これらは赤間さんが意識して工夫したそうで
    す。さすがです。職人芸です。

    View Slide

  37. View Slide

  38. 補足
    • 考察(6)で「混線」を避ける必要があるのはな
    ぜか?
    – たとえば、Aの値がXにコピーされる
    – Sの値を計算するために、Xの値を逆走することで
    参照するとき、もし混線をさける仕組みがなけれ
    ば、結局電車は単にA地点に戻る
    • Xの値が0か1であるかに関わりなく
    – 何もしないまま同じ場所に戻ってしまっては、Xの
    値によって結果を変えることができない
    – それではSの計算なんてできない

    View Slide