記事更新日: 2019年04月27日, 05月08日, 05/09, 05/10, 05/11, 05/12

将棋しょうぎのテープ
- What is a tape of the shogi?

KITASHIRAKAWA_Chiyuri
前回の話しは ここ にある☆
続きだぜ☆

目次 - Table of contents.

戻る - back

1. チューリング・マシン☆
- Turing machine ☆.

20190426wcsc74.png
KITASHIRAKAWA_Chiyuri
チューリング・マシンというのが何かという説明は にした☆
ここでは チューリング・マシンを使う。上図のようなテープがあると思ってくれだぜ☆
KIFUWARABE
何を記録するんだぜ☆?
20190426wcsc74a1.png
KITASHIRAKAWA_Chiyuri
駒を動かす手の動きを記録する☆
オリジナルの チューリング・マシン はカーソルだが、わたしはキャレットを使う☆
キャレットというのは、”間にある” カーソルだぜ☆
20190426wcsc74a2.png
OKAZAKI_Yumemi
カーソルと キャレットの違いって 1個しか無いんでしょ
20190426wcsc74a3.png
KITASHIRAKAWA_Chiyuri
カーソルは 位置だけで 物を指すことができる☆
キャレットは 位置と、 左か 右か を表す向き の2つが揃ったときに 物を指すことができる☆
KIFUWARABE
カーソルの方が 応用範囲が広く 優秀なのに……☆
KITASHIRAKAWA_Chiyuri
それでも テキスト・エディターの主流は キャレット だぜ☆
20190426wcsc74a4.png
KITASHIRAKAWA_Chiyuri
その理由が 挿入 だぜ☆
文章と文章の間に 別の新しい文章を はさみ込む というのが テキスト編集の本質というわけだぜ☆
KIFUWARABE
キャレットは 挿入しか利点がないのに……☆
挿入以外の 削除も、上書きも、範囲選択も カーソルの方が 便利なのに……☆
隙間にマウスカーソルを当てるなんて、いらいら するだろ☆
KITASHIRAKAWA_Chiyuri
現代のコンピューターの形が固まる前の 1990年代頃のビジョナリストは
挿入と選択の両方が使いやすい形のキャレットの案を出していたが
歴史が示すところでは キャレットの形がどうこうより Windowsの人気一色になったようだ☆
OKAZAKI_Yumemi
物を指すより、物を はさみこむ 方が よく使うと判断したから キャレット を使うのよね?
KITASHIRAKAWA_Chiyuri
物と物との間だけが はさみこむ というわけではない☆
広義には 先頭と何もないところの境界に はさみこむ とか、 末尾と何もないところの境界に はさみこむ とかもある☆
KITASHIRAKAWA_Chiyuri
棋譜を なぞる だけならカーソルで十分だが、
棋譜の途中から 指し継ぐ、例えば 変化 を見る、というのが主な使い方だぜ☆
キャレットが向いている☆
20190426wcsc75.png
KITASHIRAKAWA_Chiyuri
一応 チューリング・マシン を描いておこう☆
チューリング・マシン では、右へ行け とか、 左へ行け と命令を入れるのではない☆
勝手に 右に動くか 左に動くか 判断して オートで動く☆ オートマタ☆
KIFUWARABE
自動計算機なんだから 命令を入れないのは 自明だろ☆
KITASHIRAKAWA_Chiyuri
もちろん オートマタ な部分を真似する☆ チューリング・マシン だからな☆
大雑把に言うと 将棋の局面を見て 自動で 右に行くか、左に行くか 決める☆
詳細な説明には 今回の記事では踏み込まない☆
OKAZAKI_Yumemi
棋譜の左とか右って、待った か 指す かじゃないの?
KITASHIRAKAWA_Chiyuri
良さそうなら右に行き、悪そうなら左に行く。
変化を読むのが それだろ☆
今は踏み込まない☆
戻る - back

2. デデキントの切断☆
- Dedekind cut ☆.

KITASHIRAKAWA_Chiyuri
今回の記事の趣旨は、 キャレットの実装 だぜ☆
キャレットを何に使うかは 今は踏み込まない☆
KITASHIRAKAWA_Chiyuri
デデキントの切断とは何かの説明を前にしたが どこに書いたか忘れた☆
KIFUWARABE
ニコニコブログに書いたのなら 検索すれば出てくるだろ、
コンピューターの利点は全文検索だぜ☆
と思ったら 本文検索ボックスが無かった……☆
そういうとこだぞ、ドワンゴ☆
20190426wcsc76.png
KITASHIRAKAWA_Chiyuri
キャレットの位置は、x座標 と同型なのが 見れば分かるだろ☆
OKAZAKI_Yumemi
正の数と 負の数の 間 から始まるのも都合がいいわねぇ
KIFUWARABE
それって 0☆
20190426wcsc76a1.png
KITASHIRAKAWA_Chiyuri
とりあえず開始時は 右を向いていることにしておこう☆
20190426wcsc76a2.png
KITASHIRAKAWA_Chiyuri
そして、向きの方向に進む ついで に物を取ることにする☆
進まずに物を取るだけとか、進むだけというのは 無い☆ ゲット アンド ゴー☆
OKAZAKI_Yumemi
なんで そんな縛りを入れるの?
KITASHIRAKAWA_Chiyuri
取ってから進むんだったかな、それとも 進んでから取るんだったかな☆
と 2つあると どちらか悩む 物忘れ を経験したからだぜ☆
進むついでに取る の1つなら 悩まない☆
OKAZAKI_Yumemi
ものぐさ ねぇ
KITASHIRAKAWA_Chiyuri
そして、Forward(最前線へ向かって送りだす) とか、 Back(後ろに戻す) というものも無い☆
向いている方への Next(隣へ)だけがある☆
OKAZAKI_Yumemi
なんで そんな縛りを入れるの?
KITASHIRAKAWA_Chiyuri
左に向かっている最中のバックだったかな、それとも 右に向かっている最中のバックだったかな☆
左に向かってバックしてるのと、左に向かってフォワードしてるの、何か違いがあるのかな☆
そう悩んだ結果、バックせず 向いている方にネクストしろだぜ☆
KIFUWARABE
じゃあ ネクストという名前の ゲット アンド ゴー があるだけか☆
KITASHIRAKAWA_Chiyuri
そう☆
20190426wcsc76a3.png
KITASHIRAKAWA_Chiyuri
そして面白いことに、右向いてる0番地のキャレットは 0 を指しているのに対し、
左向いている1番地のキャレットも 0 を指している☆ 左向くと1小さくなる☆
KIFUWARABE
真ん中 なんかにいるから そうなる☆
20190426wcsc76a4.png
KITASHIRAKAWA_Chiyuri
これを デデキントの切断 してみるぜ☆
右向きとは 含む であり、左向きとは 含まない である、と考えれば
つじつまが合う☆
OKAZAKI_Yumemi
こんなこと 考えてたのね
> 戻る - back

3. リード アンド レコード☆
- Read and record ☆.

KITASHIRAKAWA_Chiyuri
棋譜を読む ことと、 棋譜を書く ことは、同時にやっていることにするぜ☆
OKAZAKI_Yumemi
何それ?
20190426wcsc77.png
KITASHIRAKAWA_Chiyuri
棋譜を読んだら、必ず 新しい棋譜も書かれるんだぜ☆
OKAZAKI_Yumemi
なんで そんな縛りを入れるの?
KITASHIRAKAWA_Chiyuri
どこを読んだかな、と あとで振り返ることが 頻出した☆
いわば ログ だぜ☆
KIFUWARABE
カーボンコピーかだぜ☆?
KITASHIRAKAWA_Chiyuri
そう☆
20190427wcsc78.png
KITASHIRAKAWA_Chiyuri
コンピューター・チェスの ストックフィッシュ などに見られる知恵だが、
例えば 盤をリセットしようとすると、将棋の駒だと 40個の駒を動かすために
最悪のケースで 81マスと 持ち駒14か所を 調べなければならない☆
動かしていない駒も、ちゃんと 動かしていないか調べる必要がある☆
これを わたしは 盤面スキャン と呼んでいる☆
KITASHIRAKAWA_Chiyuri
それに比べ、棋譜を読めば 将棋の場合 動いた駒、取った駒 の2つだけ 動かせばいい☆
81マスの盤面をスキャンしている間に、
例えば40手後の変化を読んで、40手戻して 元の局面にするのは最大でも 80個の駒の動きで足りる☆
これを わたしは 棋譜スキャン と呼んでいる☆
KIFUWARABE
ストックフィッシュは 棋譜スキャン だな☆
OKAZAKI_Yumemi
コンピューター将棋も 前向き枝刈りで だいたい 28~45手 読むのはザラなんでしょ。
盤面スキャンと 棋譜スキャン と どっちが優れているか 微妙じゃないの?
KITASHIRAKAWA_Chiyuri
変化を読むには 棋譜スキャン の方が圧倒的に早い☆
隣の枝まで 1手戻す、1手進める の 2手☆
KITASHIRAKAWA_Chiyuri
そこで、きふわらべ は 盤面を1つだけ持つことにする☆
代わりに 棋譜を 作ったり、消したり することにするぜ☆
戻る - back

4. カセット・デッキ☆
- Cassette deck ☆.

KITASHIRAKAWA_Chiyuri
さっきまで 何書いてたか忘れたが、続きから書くぜ☆
20190508wcsc120a0.png
KITASHIRAKAWA_Chiyuri
これが Deckデーックだぜ☆
Slotスローッ(穴)が3つあるだろ☆
KIFUWARABE
見に来ると たまに デッキの形が 変形されていて わらう☆
OKAZAKI_Yumemi
ドラフト(草稿)なのよ
KITASHIRAKAWA_Chiyuri
上が Training slotトレーニングスローッ
中が Learning slotラーニンスローッ
下が Principal slotプリンスィポスローッだぜ☆
20190508wcsc121.png
KITASHIRAKAWA_Chiyuri
そして スロットには テープではなく Tape boxティーィバーックスを入れる☆
その方が合理的だからだぜ☆
KITASHIRAKAWA_Chiyuri
とりあえず この Tape boxティーィバーックス には Tapeティーッ  を 400本ぐらい入れる☆
数に決まりはない☆ マシンパワーに合わせろ☆
20190508wcsc120a2.png
KITASHIRAKAWA_Chiyuri
カセット・デッキの スロットは 抜き差しせず、
テープ・ボックスが ずっと 刺さっている☆
その方が 合理的だからだぜ☆
KIFUWARABE
それは スロット じゃないよな☆
20190512wcsc133.png
KITASHIRAKAWA_Chiyuri
具体的には、テープ・ボックスは JSONファイルで、
テープは 対局1個分のデータだぜ☆
合理的にしてから おかしくなってきた☆
OKAZAKI_Yumemi
最適化は 完成してから やればいいのに
KITASHIRAKAWA_Chiyuri
テープ・ボックス は 最初は空っぽ☆
20190508wcsc121a1b1.png
KITASHIRAKAWA_Chiyuri
最初は テープボックスは空☆
キャレットは 0番地 に置いておくが、
何番目のテープを指しているとかいえば、Noneナーッン だぜ☆
20190508wcsc121a2b1c1.png
KITASHIRAKAWA_Chiyuri
Addアーット すると テープが1本増える☆
キャレットは触らない☆
テープはまだ None 番目☆
20190508wcsc121a2b3.png
KITASHIRAKAWA_Chiyuri
ファイルを読み込むというのは、テープ・ボックスに テープをいくつもAddするということだぜ☆
キャレットは触らない☆
テープはやはり None 番目☆
20190508wcsc121a3b2.png
KITASHIRAKAWA_Chiyuri
Seekスィーク すると キャレットは 1 に進み、
テープは 0 番目が指される☆
KITASHIRAKAWA_Chiyuri
キャレットは テープの間 を指し、
インデックスは テープ を指す☆
どちらも 0 から始まる☆
20190508wcsc121a3b3.png
KITASHIRAKAWA_Chiyuri
並んでいるテープの本数と、キャレットが等しいときに Seek すると、
エンド・オブ・テープ・ボックスだぜ☆ キャレットは進まない☆
20190508wcsc121a1b2.png
KITASHIRAKAWA_Chiyuri
テープ・ボックスが 終わってんのに じっとしてても おもんないからな☆
Clearクィア して、最初の状態に合流しろだぜ☆
20190510wcsc122a1.png
KITASHIRAKAWA_Chiyuri
将棋サーバーから 局面が送られてきたら、ラーニング・テープ に変換して入れろだぜ☆
KITASHIRAKAWA_Chiyuri
CSA将棋サーバーは 1手ずつ送ってくるが、
USIプロトコルは 局面を投げてくる☆
KITASHIRAKAWA_Chiyuri
無駄くさいが USIプロトコルに合わせ、
1手ごとにテープを1本作って Add しろだぜ☆
OKAZAKI_Yumemi
ラーニング・スロットは 現局面が入っていると考えていいの?
KITASHIRAKAWA_Chiyuri
思考なり、学習なりが終わったら、現局面に必ず戻している、と考えていい☆
20190510wcsc122a2.png
KITASHIRAKAWA_Chiyuri
思考するときは、自分の記憶領域から 棋譜を取り出して トレーニング・テープ に変換して入れろだぜ☆
KITASHIRAKAWA_Chiyuri
トレーニング・テープと 現局面をパターン・マッチさせて、
パターン・マッチ中に 盤駒を動かすことと、ラーニング・テープに棋譜を書き込むことは 同期 してて、
パターン・マッチが終われば 現局面に戻す☆
KITASHIRAKAWA_Chiyuri
ラーニング・テープには 非合法手が現れたり、手筋 が現れたり、すぐ消えたりする☆
20190510wcsc122a3.png
KITASHIRAKAWA_Chiyuri
将棋盤は ラーニング・テープ と同期しているので、
トレーニング・テープを どれだけ 早送り、巻き戻し しても 将棋盤とは関係がないぜ☆
20190510wcsc122a4.png
KITASHIRAKAWA_Chiyuri
同期というのを補足しておくと、
棋譜を進める向きも 同期 している☆
KIFUWARABE
記録係のターンまで 棋譜に取らなくていいのに……☆
戻る - back

5. シーク・ムーブ☆
- Seek a move☆.

20190510wcsc123.png
KITASHIRAKAWA_Chiyuri
この絵は 指し手 を表しているとする☆
20190510wcsc123a1.png
KITASHIRAKAWA_Chiyuri
この絵は 2手分☆
20190510wcsc123a2.png
KITASHIRAKAWA_Chiyuri
キャレットが 先頭にあるとき、記録係だぜ☆
20190510wcsc123a3.png
KITASHIRAKAWA_Chiyuri
キャレットが 青いタテボウを越えて、緑色のところにあるとき、先手、または後手だぜ☆
20190510wcsc123a4.png
KITASHIRAKAWA_Chiyuri
青いタテボウを越えると、また 記録係☆
20190510wcsc123a5.png
KITASHIRAKAWA_Chiyuri
青いタテボウを越えると、後手、または先手だぜ☆
KIFUWARABE
めんどくさ☆
20190510wcsc123a6.png
KITASHIRAKAWA_Chiyuri
シークした結果は、3つになる☆ アウェア、フォーエバー、ドリーム☆
KIFUWARABE
なぜ ファンシーな名前にした☆?
KITASHIRAKAWA_Chiyuri
新手を探している人の気分に合わせている☆
気づいたり、もう無かったり、なんかありそうだが まだ ふわふわと ぼーっとしているときだぜ☆
戻る - back

6. ツー・ヘッド・ベクター☆
- 2 heads vector ☆.

20190511wcsc125.png
KITASHIRAKAWA_Chiyuri
オレンジ色の升が 負の方を表すベクター(配列)の要素を表していて、その中に書かれている数は インデックス、
水色の升が    正の方を表すベクター(配列)の要素を表していて、その中に書かれている数は インデックスだぜ☆
赤色の数は    キャレットの番地だぜ☆ マイナス・ゼロは無い☆
20190511wcsc125a1.png
KITASHIRAKAWA_Chiyuri
キャレットが右向きのときは、キャレットが移動に キャレットの番地が負だったときだけ、
次に読み取るノートは 負の方の配列の要素 と判定する☆
20190511wcsc125a2.png
KITASHIRAKAWA_Chiyuri
キャレットが左向きのときは、キャレットが移動に キャレットの番地が負だったときだけ、
次に読み取るノートは 負の方の配列の要素 と判定する☆
KITASHIRAKAWA_Chiyuri
これらが非対称なのは 正と負をまたぐ キャレットの0番地が、正でも負でもないからだぜ☆
仮に ゼロ は 正の数 としているが、正に偏ってるよな☆
20190511wcsc125a3.png
KITASHIRAKAWA_Chiyuri
キャレットの移動を伴わず、向きを反転させることを ルックバック と呼ぶことにする☆
後ろを向いて 後ろを向いたら 前だぜ☆
OKAZAKI_Yumemi
今どっちを向いているかに関わらず 左側を向きたいときは どうするの?
KITASHIRAKAWA_Chiyuri
Turn towards negative infinity と名付ければいいだろ☆
そんなに使うところはない☆
20190511wcsc125a4.png
KITASHIRAKAWA_Chiyuri
向いている方に 1升移動することを Seek と呼ぶことにする☆
20190511wcsc125a5b1.png
KITASHIRAKAWA_Chiyuri
前を向いたまま うしろにさがることを Back walkバックォーク と呼ぶことにする☆
KITASHIRAKAWA_Chiyuri
わたしの 思想 では Back walk は禁止する☆
バックォーク したければ、ルックバック、シーク、ルックバック のように
ルックバックで挟めだぜ☆
OKAZAKI_Yumemi
なんで?
20190511wcsc128.png
KITASHIRAKAWA_Chiyuri
3つのプログラムが 一斉に 動いているとしよう☆
20190511wcsc128a1.png
KITASHIRAKAWA_Chiyuri
まず、3つのプログラムが 一斉に ルックバックする☆
20190511wcsc128a2.png
KITASHIRAKAWA_Chiyuri
シークするのも 一斉だぜ☆ 足並みを揃えるんだぜ☆
20190511wcsc128a3.png
KITASHIRAKAWA_Chiyuri
ここで時間切れになった場合、一斉に ルックバックしろだぜ☆
バックウォーク で 1つのプログラムが先々 進むと 横の同期が乱れてしまう☆
OKAZAKI_Yumemi
フーン。
うまくやれば バックウォークで いいと思うけどなあ
KIFUWARABE
お父んの頭が ボトルネック なのだろう☆
コントロールできるようにやれだぜ☆
20190511wcsc125a4b2.png
KITASHIRAKAWA_Chiyuri
シークした結果は、リザルトではなく アウェアネス と呼ぶことにする☆
リザルトという単語は Rust言語で別の意味で使われているから避ける☆
20190511wcsc125a6.png
KITASHIRAKAWA_Chiyuri
キャレットが端っこにいることを オーバー と呼ぶことにする☆
オーバーしているときに シーク しても キャレットは動かない☆
20190511wcsc125a6b3.png
KITASHIRAKAWA_Chiyuri
キャレットが動かなかったときの シークの結果は、配列のインデックスが None だぜ☆
20190511wcsc126a1.png
KITASHIRAKAWA_Chiyuri
最初の状態は 上図の通り☆
KITASHIRAKAWA_Chiyuri
ルックバックを何回やっても アウェアネスに変更はない☆
シーク したときだけ アウェアネスは更新される☆
20190511wcsc127.png
KITASHIRAKAWA_Chiyuri
キャレットの向き に関わらず、 アウェアネス は2通り どちらも ありえる☆ 
ルックバックでは アウェアネスは 更新されないからだぜ☆
KITASHIRAKAWA_Chiyuri
ベクター(配列)の最後の要素のインデックスを調べたいときがある☆
アウェアネスは、キャレットの左側か、右側か 分からない☆
そこで 以下の1つの操作を 追加する☆
20190511wcsc127a1.png
KITASHIRAKAWA_Chiyuri
シークした結果のアウェアネスとは別に、
ピーク を調べることができることにする☆
キャレットから見て、ゼロに近い方の ベクターのインデックスを取るんだぜ☆
KITASHIRAKAWA_Chiyuri
どちらか決められない、という状況は 非決定論的(ノン・デターミニスティック)、
必ず1つに決まる状況を、 決定論的(デターミニスティック) という☆
プログラムは デターミニスティック に操作できるように作れだぜ☆
20190511wcsc127a2.png
KITASHIRAKAWA_Chiyuri
ただし、キャレットが 0番地にあるとき、
キャレットの向きによって ピークの結果の 正・負 が変わるものとするぜ☆
戻る - back

7. プレイ☆
- Play ☆.

20190512wcsc129a1b2.png
KITASHIRAKAWA_Chiyuri
棋譜の通りに 盤上の駒を動かすことを Replayリィップレー と呼ぶことにする☆
KITASHIRAKAWA_Chiyuri
ただし、盤上の駒を動かすと ラーニング・テープの末尾に追記される☆
20190512wcsc130b2.png
KITASHIRAKAWA_Chiyuri
指し手を戻した動きも、逆順を表す印をつけて 末尾に追記される☆
ストックフィッシュ探索みたいに 思考で1億局面も探索したら 1億を超える単語が記録されてメモリが逝ってしまう☆
OKAZAKI_Yumemi
どうすんの?
KITASHIRAKAWA_Chiyuri
全幅とか選択とか ゲームツリーを探索するようなソフトは、デッキにくっついてる盤上の駒を動かすなだぜ☆
大盤解説程度の、ヒューマン・プレゼンタブル な 操作を 行えだぜ☆
KITASHIRAKAWA_Chiyuri
逆順に シークし終わったら、
ラーニング・テープのキャレットをオーバーの位置にリセットしろだぜ☆ これで合流する☆
20190512wcsc129a2b2.png
KITASHIRAKAWA_Chiyuri
棋譜ではなく、手動や、自動によって 盤上の駒を動かすことを Improviseインプロバイズ と呼ぶことにする☆
OKAZAKI_Yumemi
ラーニング・テープって 編集できないの?
KITASHIRAKAWA_Chiyuri
ラーニング・テープの編集機能は 後回しだぜ☆
土台となる部分が まだまだ 他にあるからな☆
KIFUWARABE
捨てた読み筋を ラーニング・テープ に残すのはいいが、
さすがに 盤の操作ミス まで ラーニング・テープ に残すのは いかがなものか☆
20190512wcsc132a1.png
KITASHIRAKAWA_Chiyuri
ロールバック という操作を認めることにする☆
ラーニング・テープの 末端を削除し、
読み込んでいるノートと一致することを確認して シークするというルールだぜ☆
不整合があれば パニック☆ 強制終了だぜ☆
20190512wcsc132a2.png
KITASHIRAKAWA_Chiyuri
読み込んでいるテープがなくても使えることにする☆
戻る - back

8. オーディオ・ラック☆
- Audio rack ☆.

KITASHIRAKAWA_Chiyuri
なんども プログラムが破綻しているんだが、
そのつど 作り直していこう☆
OKAZAKI_Yumemi
完成するまで 最適化なんか しなければいいのよ
20190512wcsc131a1.png
KITASHIRAKAWA_Chiyuri
オーディオ・ラックと ポジションは 独立させ、
オーディオ・ラックと ポジションを 同期 させる第三者として Performer を用意するぜ☆
KITASHIRAKAWA_Chiyuri
テープ・ボックシーズ というのは PCのファイル・システム に当たる☆
20190512wcsc134.png
KITASHIRAKAWA_Chiyuri
3つの異なるファイルをロックする、という意味がある☆ ファイルの実体が被っていないことを保証する☆
KITASHIRAKAWA_Chiyuri
トレーニング・テープ・ボックス は 読取専用☆
定跡を見るのに使うぐらいの使い方だぜ☆
KITASHIRAKAWA_Chiyuri
ラーニング・テープ・ボックス は まるで ログ書込 のように使用☆
KITASHIRAKAWA_Chiyuri
プリンキパル・テープ・ボックス は 現対局の 棋譜 になるように記録する☆
KIFUWARABE
テープ・ボックスから テープを1本引き抜いて デッキのスロットに指すより、
テープ・ボックスに カーソルを付けた方が 合理的 だぜ☆
KITASHIRAKAWA_Chiyuri
まったくだぜ☆