記事更新日: 2019年04月27日, 05月08日, 05/09, 05/10, 05/11, 05/12
将棋
しょうぎ
のテープ
- What is a tape of the shogi?
前回の話しは
ここ
にある☆
続きだぜ☆
目次
- Table of contents.
1. チューリング・マシン☆
- Turing machine ☆.
2. デデキントの切断☆
- Dedekind cut ☆.
3. リード アンド レコード☆
- Read and record ☆.
4. カセット・デッキ☆
- Cassette deck ☆.
5. シーク・ムーブ☆
- Seek a move ☆.
6. ツー・ヘッド・ベクター☆
- 2 heads vector ☆.
7. プレイ☆
- Play ☆.
8. オーディオ・ラック☆
- Audio rack ☆.
戻る - back
1. チューリング・マシン☆
- Turing machine ☆.
チューリング・マシンというのが何かという説明は
前
にした☆
ここでは チューリング・マシンを使う。上図のようなテープがあると思ってくれだぜ☆
何を記録するんだぜ☆?
駒を動かす手の動きを記録する☆
オリジナルの チューリング・マシン はカーソルだが、わたしはキャレットを使う☆
キャレットというのは、”間にある” カーソルだぜ☆
カーソルと キャレットの違いって 1個しか無いんでしょ
カーソルは 位置だけで 物を指すことができる☆
キャレットは 位置と、 左か 右か を表す向き の2つが揃ったときに 物を指すことができる☆
カーソルの方が 応用範囲が広く 優秀なのに……☆
それでも テキスト・エディターの主流は キャレット だぜ☆
その理由が 挿入 だぜ☆
文章と文章の間に 別の新しい文章を はさみ込む というのが テキスト編集の本質というわけだぜ☆
キャレットは 挿入しか利点がないのに……☆
挿入以外の 削除も、上書きも、範囲選択も カーソルの方が 便利なのに……☆
隙間にマウスカーソルを当てるなんて、いらいら するだろ☆
現代のコンピューターの形が固まる前の 1990年代頃のビジョナリストは
挿入と選択の両方が使いやすい形のキャレットの案を出していたが
歴史が示すところでは キャレットの形がどうこうより Windowsの人気一色になったようだ☆
物を指すより、物を はさみこむ 方が よく使うと判断したから キャレット を使うのよね?
物と物との間だけが はさみこむ というわけではない☆
広義には 先頭と何もないところの境界に はさみこむ とか、 末尾と何もないところの境界に はさみこむ とかもある☆
棋譜を なぞる だけならカーソルで十分だが、
棋譜の途中から 指し継ぐ、例えば 変化 を見る、というのが主な使い方だぜ☆
キャレットが向いている☆
一応 チューリング・マシン を描いておこう☆
チューリング・マシン では、右へ行け とか、 左へ行け と命令を入れるのではない☆
勝手に 右に動くか 左に動くか 判断して オートで動く☆ オートマタ☆
自動計算機なんだから 命令を入れないのは 自明だろ☆
もちろん オートマタ な部分を真似する☆ チューリング・マシン だからな☆
大雑把に言うと 将棋の局面を見て 自動で 右に行くか、左に行くか 決める☆
詳細な説明には 今回の記事では踏み込まない☆
棋譜の左とか右って、待った か 指す かじゃないの?
良さそうなら右に行き、悪そうなら左に行く。
変化を読むのが それだろ☆
今は踏み込まない☆
戻る - back
2. デデキントの切断☆
- Dedekind cut ☆.
今回の記事の趣旨は、 キャレットの実装 だぜ☆
キャレットを何に使うかは 今は踏み込まない☆
デデキントの切断とは何かの説明を前にしたが どこに書いたか忘れた☆
ニコニコブログに書いたのなら 検索すれば出てくるだろ、
コンピューターの利点は全文検索だぜ☆
と思ったら 本文検索ボックスが無かった……☆
そういうとこだぞ、ドワンゴ☆
キャレットの位置は、x座標 と同型なのが 見れば分かるだろ☆
正の数と 負の数の 間 から始まるのも都合がいいわねぇ
それって 0☆
とりあえず開始時は 右を向いていることにしておこう☆
そして、向きの方向に進む ついで に物を取ることにする☆
進まずに物を取るだけとか、進むだけというのは 無い☆ ゲット アンド ゴー☆
なんで そんな縛りを入れるの?
取ってから進むんだったかな、それとも 進んでから取るんだったかな☆
と 2つあると どちらか悩む 物忘れ を経験したからだぜ☆
進むついでに取る の1つなら 悩まない☆
ものぐさ ねぇ
そして、Forward(最前線へ向かって送りだす) とか、 Back(後ろに戻す) というものも無い☆
向いている方への Next(隣へ)だけがある☆
なんで そんな縛りを入れるの?
左に向かっている最中のバックだったかな、それとも 右に向かっている最中のバックだったかな☆
左に向かってバックしてるのと、左に向かってフォワードしてるの、何か違いがあるのかな☆
そう悩んだ結果、バックせず 向いている方にネクストしろだぜ☆
じゃあ ネクストという名前の ゲット アンド ゴー があるだけか☆
そう☆
そして面白いことに、右向いてる0番地のキャレットは 0 を指しているのに対し、
左向いている1番地のキャレットも 0 を指している☆ 左向くと1小さくなる☆
真ん中 なんかにいるから そうなる☆
これを デデキントの切断 してみるぜ☆
右向きとは 含む であり、左向きとは 含まない である、と考えれば
つじつまが合う☆
こんなこと 考えてたのね
>
戻る - back
3. リード アンド レコード☆
- Read and record ☆.
棋譜を読む ことと、 棋譜を書く ことは、同時にやっていることにするぜ☆
何それ?
棋譜を読んだら、必ず 新しい棋譜も書かれるんだぜ☆
なんで そんな縛りを入れるの?
どこを読んだかな、と あとで振り返ることが 頻出した☆
いわば ログ だぜ☆
カーボンコピーかだぜ☆?
そう☆
コンピューター・チェスの ストックフィッシュ などに見られる知恵だが、
例えば 盤をリセットしようとすると、将棋の駒だと 40個の駒を動かすために
最悪のケースで 81マスと 持ち駒14か所を 調べなければならない☆
動かしていない駒も、ちゃんと 動かしていないか調べる必要がある☆
これを わたしは 盤面スキャン と呼んでいる☆
それに比べ、棋譜を読めば 将棋の場合 動いた駒、取った駒 の2つだけ 動かせばいい☆
81マスの盤面をスキャンしている間に、
例えば40手後の変化を読んで、40手戻して 元の局面にするのは最大でも 80個の駒の動きで足りる☆
これを わたしは 棋譜スキャン と呼んでいる☆
ストックフィッシュは 棋譜スキャン だな☆
コンピューター将棋も 前向き枝刈りで だいたい 28~45手 読むのはザラなんでしょ。
盤面スキャンと 棋譜スキャン と どっちが優れているか 微妙じゃないの?
変化を読むには 棋譜スキャン の方が圧倒的に早い☆
隣の枝まで 1手戻す、1手進める の 2手☆
そこで、きふわらべ は 盤面を1つだけ持つことにする☆
代わりに 棋譜を 作ったり、消したり することにするぜ☆
戻る - back
4. カセット・デッキ☆
- Cassette deck ☆.
さっきまで 何書いてたか忘れたが、続きから書くぜ☆
これが
Deck
デーック
だぜ☆
Slot
スローッ
(穴)が3つあるだろ☆
見に来ると たまに デッキの形が 変形されていて わらう☆
ドラフト(草稿)なのよ
上が
Training slot
トレーニングスローッ
、
中が
Learning slot
ラーニンスローッ
、
下が
Principal slot
プリンスィポスローッ
だぜ☆
そして スロットには テープではなく
Tape box
ティーィバーックス
を入れる☆
その方が合理的だからだぜ☆
とりあえず この
Tape box
ティーィバーックス
には
Tape
ティーッ
を 400本ぐらい入れる☆
数に決まりはない☆ マシンパワーに合わせろ☆
カセット・デッキの スロットは 抜き差しせず、
テープ・ボックスが ずっと 刺さっている☆
その方が 合理的だからだぜ☆
それは スロット じゃないよな☆
具体的には、テープ・ボックスは JSONファイルで、
テープは 対局1個分のデータだぜ☆
合理的にしてから おかしくなってきた☆
最適化は 完成してから やればいいのに
テープ・ボックス は 最初は空っぽ☆
最初は テープボックスは空☆
キャレットは 0番地 に置いておくが、
何番目のテープを指しているとかいえば、
None
ナーッン
だぜ☆
Add
アーット
すると テープが1本増える☆
キャレットは触らない☆
テープはまだ None 番目☆
ファイルを読み込むというのは、テープ・ボックスに テープをいくつもAddするということだぜ☆
キャレットは触らない☆
テープはやはり None 番目☆
Seek
スィーク
すると キャレットは 1 に進み、
テープは 0 番目が指される☆
キャレットは テープの間 を指し、
インデックスは テープ を指す☆
どちらも 0 から始まる☆
並んでいるテープの本数と、キャレットが等しいときに Seek すると、
エンド・オブ・テープ・ボックスだぜ☆ キャレットは進まない☆
テープ・ボックスが 終わってんのに じっとしてても おもんないからな☆
Clear
クィア
して、最初の状態に合流しろだぜ☆
将棋サーバーから 局面が送られてきたら、ラーニング・テープ に変換して入れろだぜ☆
CSA将棋サーバーは 1手ずつ送ってくるが、
USIプロトコルは 局面を投げてくる☆
無駄くさいが USIプロトコルに合わせ、
1手ごとにテープを1本作って Add しろだぜ☆
ラーニング・スロットは 現局面が入っていると考えていいの?
思考なり、学習なりが終わったら、現局面に必ず戻している、と考えていい☆
思考するときは、自分の記憶領域から 棋譜を取り出して トレーニング・テープ に変換して入れろだぜ☆
トレーニング・テープと 現局面をパターン・マッチさせて、
パターン・マッチ中に 盤駒を動かすことと、ラーニング・テープに棋譜を書き込むことは 同期 してて、
パターン・マッチが終われば 現局面に戻す☆
ラーニング・テープには 非合法手が現れたり、手筋 が現れたり、すぐ消えたりする☆
将棋盤は ラーニング・テープ と同期しているので、
トレーニング・テープを どれだけ 早送り、巻き戻し しても 将棋盤とは関係がないぜ☆
同期というのを補足しておくと、
棋譜を進める向きも 同期 している☆
記録係のターンまで 棋譜に取らなくていいのに……☆
戻る - back
5. シーク・ムーブ☆
- Seek a move☆.
この絵は 指し手 を表しているとする☆
この絵は 2手分☆
キャレットが 先頭にあるとき、記録係だぜ☆
キャレットが 青いタテボウを越えて、緑色のところにあるとき、先手、または後手だぜ☆
青いタテボウを越えると、また 記録係☆
青いタテボウを越えると、後手、または先手だぜ☆
めんどくさ☆
シークした結果は、3つになる☆ アウェア、フォーエバー、ドリーム☆
なぜ ファンシーな名前にした☆?
新手を探している人の気分に合わせている☆
気づいたり、もう無かったり、なんかありそうだが まだ ふわふわと ぼーっとしているときだぜ☆
戻る - back
6. ツー・ヘッド・ベクター☆
- 2 heads vector ☆.
オレンジ色の升が 負の方を表すベクター(配列)の要素を表していて、その中に書かれている数は インデックス、
水色の升が 正の方を表すベクター(配列)の要素を表していて、その中に書かれている数は インデックスだぜ☆
赤色の数は キャレットの番地だぜ☆ マイナス・ゼロは無い☆
キャレットが右向きのときは、キャレットが移動
前
に キャレットの番地が負だったときだけ、
次に読み取るノートは 負の方の配列の要素 と判定する☆
キャレットが左向きのときは、キャレットが移動
後
に キャレットの番地が負だったときだけ、
次に読み取るノートは 負の方の配列の要素 と判定する☆
これらが非対称なのは 正と負をまたぐ キャレットの0番地が、正でも負でもないからだぜ☆
仮に ゼロ は 正の数 としているが、正に偏ってるよな☆
キャレットの移動を伴わず、向きを反転させることを ルックバック と呼ぶことにする☆
後ろを向いて 後ろを向いたら 前だぜ☆
今どっちを向いているかに関わらず 左側を向きたいときは どうするの?
Turn towards negative infinity と名付ければいいだろ☆
そんなに使うところはない☆
向いている方に 1升移動することを Seek と呼ぶことにする☆
前を向いたまま うしろにさがることを
Back walk
バックォーク
と呼ぶことにする☆
わたしの 思想 では Back walk は禁止する☆
バックォーク したければ、ルックバック、シーク、ルックバック のように
ルックバックで挟めだぜ☆
なんで?
3つのプログラムが 一斉に 動いているとしよう☆
まず、3つのプログラムが 一斉に ルックバックする☆
シークするのも 一斉だぜ☆ 足並みを揃えるんだぜ☆
ここで時間切れになった場合、一斉に ルックバックしろだぜ☆
バックウォーク で 1つのプログラムが先々 進むと 横の同期が乱れてしまう☆
フーン。
うまくやれば バックウォークで いいと思うけどなあ
お父んの頭が ボトルネック なのだろう☆
コントロールできるようにやれだぜ☆
シークした結果は、リザルトではなく アウェアネス と呼ぶことにする☆
リザルトという単語は Rust言語で別の意味で使われているから避ける☆
キャレットが端っこにいることを オーバー と呼ぶことにする☆
オーバーしているときに シーク しても キャレットは動かない☆
キャレットが動かなかったときの シークの結果は、配列のインデックスが None だぜ☆
最初の状態は 上図の通り☆
ルックバックを何回やっても アウェアネスに変更はない☆
シーク したときだけ アウェアネスは更新される☆
キャレットの向き に関わらず、 アウェアネス は2通り どちらも ありえる☆
ルックバックでは アウェアネスは 更新されないからだぜ☆
ベクター(配列)の最後の要素のインデックスを調べたいときがある☆
アウェアネスは、キャレットの左側か、右側か 分からない☆
そこで 以下の1つの操作を 追加する☆
シークした結果のアウェアネスとは別に、
ピーク を調べることができることにする☆
キャレットから見て、ゼロに近い方の ベクターのインデックスを取るんだぜ☆
どちらか決められない、という状況は 非決定論的(ノン・デターミニスティック)、
必ず1つに決まる状況を、 決定論的(デターミニスティック) という☆
プログラムは デターミニスティック に操作できるように作れだぜ☆
ただし、キャレットが 0番地にあるとき、
キャレットの向きによって ピークの結果の 正・負 が変わるものとするぜ☆
戻る - back
7. プレイ☆
- Play ☆.
棋譜の通りに 盤上の駒を動かすことを
Replay
リィップレー
と呼ぶことにする☆
ただし、盤上の駒を動かすと ラーニング・テープの末尾に追記される☆
指し手を戻した動きも、逆順を表す印をつけて 末尾に追記される☆
ストックフィッシュ探索みたいに 思考で1億局面も探索したら 1億を超える単語が記録されてメモリが逝ってしまう☆
どうすんの?
全幅とか選択とか ゲームツリーを探索するようなソフトは、デッキにくっついてる盤上の駒を動かすなだぜ☆
大盤解説程度の、ヒューマン・プレゼンタブル な 操作を 行えだぜ☆
逆順に シークし終わったら、
ラーニング・テープのキャレットをオーバーの位置にリセットしろだぜ☆ これで合流する☆
棋譜ではなく、手動や、自動によって 盤上の駒を動かすことを
Improvise
インプロバイズ
と呼ぶことにする☆
ラーニング・テープって 編集できないの?
ラーニング・テープの編集機能は 後回しだぜ☆
土台となる部分が まだまだ 他にあるからな☆
捨てた読み筋を ラーニング・テープ に残すのはいいが、
さすがに 盤の操作ミス まで ラーニング・テープ に残すのは いかがなものか☆
ロールバック という操作を認めることにする☆
ラーニング・テープの 末端を削除し、
読み込んでいるノートと一致することを確認して シークするというルールだぜ☆
不整合があれば パニック☆ 強制終了だぜ☆
読み込んでいるテープがなくても使えることにする☆
戻る - back
8. オーディオ・ラック☆
- Audio rack ☆.
なんども プログラムが破綻しているんだが、
そのつど 作り直していこう☆
完成するまで 最適化なんか しなければいいのよ
オーディオ・ラックと ポジションは 独立させ、
オーディオ・ラックと ポジションを 同期 させる第三者として Performer を用意するぜ☆
テープ・ボックシーズ というのは PCのファイル・システム に当たる☆
3つの異なるファイルをロックする、という意味がある☆ ファイルの実体が被っていないことを保証する☆
トレーニング・テープ・ボックス は 読取専用☆
定跡を見るのに使うぐらいの使い方だぜ☆
ラーニング・テープ・ボックス は まるで ログ書込 のように使用☆
プリンキパル・テープ・ボックス は 現対局の 棋譜 になるように記録する☆
テープ・ボックスから テープを1本引き抜いて デッキのスロットに指すより、
テープ・ボックスに カーソルを付けた方が 合理的 だぜ☆
まったくだぜ☆