CSA通信プロトコルの諸問題
コンピュータ将棋間の通信プロトコルとしてはCSA通信プロトコルを用いるのが一般的である。
コンピュータ将棋の大会でも普通はこのプロトコルを用いる。
CSA通信プロトコル
http://www.computer-shogi.org/protocol/
ところで、この通信プロトコルについて気になっていることがあるので書いてみる。
■ マルチステートメント
前から気になっているのですがマルチステートメントの扱いが
微妙すぎて適用箇所が見当たらないような..
私もそれは思う。どのコマンドがマルチステートメント対応なのか、それが明確でないので恐くて使えない。
実際にカンマ(マルチステートメント)の読み込みをサポートしている将棋ソフトは少ないだろう。こんな形式で出力した日には読み込めない将棋ソフトが続出するのは火を見るよりも明らかだ。使っている将棋ソフトがあるとも思えない。
「既存のソフトで使われることはあるかも知れないが、マルチステートメントはサポートしていない将棋ソフトがたくさんあるからこれを出力のときには使わないこと。」とか書いてもらうわけにはいかないのだろうか。
■ Webに掲載されている例が間違っている
CSAサーバ プロトコル ver.1.1.2
http://www.computer-shogi.org/protocol/tcp_ip_server_112.html
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI * * * * * -KA *
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
P4 * * * * * * * * *
P5 * * * * * * * * *
P6 * * * * * * * * *
P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
P8 * +KA * * * * * +HI *
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
この局面データだが、行末の"*"の直後にスペースが無い。1つの駒は3文字固定ではないのか?
CSA標準棋譜ファイル形式
http://www.computer-shogi.org/wcsc12/record.html
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI * * * * * -KA *
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
P4 * * * * * * * * *
P5 * * * * * * * * *
P6 * * * * * * * * *
P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
P8 * +KA * * * * * +HI *
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
こちらの局面はもっとひどい。駒がない場所はすべて" *"の2文字になっている。
1行の駒を以下のように示す。行番号に続き、先後の区別と駒の種類を記述する。先後の区別が"+""-"以外のとき、駒がないとする。
1升3文字で9升分記述しないといけない。例:
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI * * * * * -KA *
この表現だと1マス3文字固定なのかどうかがよくわからない。例を見ると3文字固定になっていない。
そもそも、駒がない場所に" * "を使えとも書かれていない。「"+","-"がなければ駒がない」だけでここには仕様上は何を書いても良いことになる。空白のマスが" * "だと仮定してはならない。
そうは言っても、そういう仮定をしているプログラムがあるかも知れないので、出力するときは" * "を出力すべきだろう。この点、「CSA標準棋譜ファイル形式」のほうに「出力するときは" * "を出力することを推奨する」と書いてもらいたい。
ところで、何文字が1マスに相当するのか明確でないと、" * *"が何マスぶんの空白なのかを確定させることは出来ない。結局のところ、1マス3文字固定であると解釈すべきだろう。
それならば、「CSA標準棋譜ファイル形式」の例は非常にまずい。「CSA標準棋譜ファイル形式」にも「CSA通信プロトコル」にもこのような誤った例が伝統的に書かれている。これは早急に修正すべきだろう。
次に、1マス3文字なのはわかったが、行末のスペースは省略して良いのか?という問題がある。1マスは3文字なのだから、行末のスペースが省略されていたら、そこにはスペースがあるとして解釈すべきなのかも知れない。
「CSA標準棋譜ファイル形式」のほうの例はひどいとしても、「CSA通信プロトコル」のほうは、盤面の各段の"*"のあとの行末のスペースが一つ欠けているだけである。この場合、末尾にスペースを補って解釈すれば読み込めるはずである。
実際、うさぴょんやBlunderはそのように解釈する。
「CSA通信プロトコル」がこのように間違ったまま長らく掲載されているので、そういうお行儀の悪いプログラムがあってもおかしくはないし、ユーザーが棋譜をどこかからコピペするときに行末のスペースというのはコピーされないことがあるので、行が欠けている部分はスペースを補うのが親切というものだ。
しかし仕様上、ここにスペースを補って解釈すべきなのかどうかは私はよくわからない。Bonanzaはそういう解釈はせずにエラー扱いにする。私は保木さんに、ここは修正したほうが良いと伝えて、次のバージョン(4.1.3か?)では修正するとの返答を得た。
以上のように、ユーザーがコピペするときにスペースを欠落させてしまうことがあるという現実的な理由により、「CSA標準棋譜ファイル形式」では、「盤面表現で、1行が2 + 3×9 = 29文字に満たないときは行末にスペースを補って解釈する。」と明記したほうが良いと思う。
■ Webに掲載されている「CSA標準棋譜ファイル形式」は電子化するときのミスか?
「CSA標準棋譜ファイル形式」(→ http://www.computer-shogi.org/wcsc12/record.html )は、もともと
(1) 「コンピュータ将棋ファイル記述形式」(第1版)、CSA 資料集 Vol.1
(2) 「通信将棋規約の案」,CSA 資料集 Vol.2
(3) 「第1回コンピュータ将棋選手権, 通信仕様」, CSA 資料集 Vol.4
ここに載っていたものを電子化したのだと思うが、入力のときのミスがいたるところに散見される。
棋譜ファイルは。次のデータから成る。
「は」のあとの「。」
上の成駒:TO,NY,NK,NG, UM,RY
何故か「NG,」のあとに半角スペースが入っていたり。
ひょっとすると、「P2 * -HI * * * * * -KA *」などとなっていたのは、電子化するときのミスではないかと思う。
■ 駒落ちの表現
あと細かいことを言えば「CSA標準棋譜ファイル形式」は、仕様書としての書き方もややまずい。
"N+"に続き +側(先手、下手)の対局者名を記述する。"N-"に続き-側(後手、上手)の対局者名を記述する。それぞれ1行とする。
駒落ちのときに +側が「下手(したて)」であるという規定は、駒落ちのところにも書くべきだ。対局者名のところにだけ書けば済むものじゃない。
駒落ちに関してさらに言えば、CSA形式の駒落ちは、落とす駒を自由に決定できる。要するに、先手側の駒を落とすことだってできるし、先手の飛車角を落として、かつ、後手の飛車を落したような局面も作ることが出来る。その場合どちらが「下手(したて)」になるのか?
おそらく「CSA標準棋譜ファイル形式」の定めるところとしては、7〜9段が自陣のほうが「下手(したて)」という扱いなのだろうが、通常の将棋では使わないような駒落ちまでフォーマット上は作れるのだから、それはきちんと定義しておかないとまずい。