Bonanzaの王手生成

上の局面で、後手玉は詰まないことは簡単に分かるけれど、
Bonanzaのdf-pnは詰みと判定します。


以下、Bonanzaの王手生成で、香車が成る手を生成するところ。

  bb_piece = BB_BLANCE;
  while( BBTest( bb_piece ) )
    {
      from = LastOne( bb_piece );
      Xor( from, bb_piece );

      bb_chk.p[0] = abb_w_gold_attacks[sq_wk].p[0];
      bb_chk.p[1] = bb_chk.p[2] = 0;

      idirec = (int)adirec[sq_wk][from];
      if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
        {
          add_behind_attacks( &bb_chk, idirec, sq_wk );
        }

      BBAnd( bb_chk, bb_chk, AttackFile( from ) );
      BBAnd( bb_chk, bb_chk, abb_minus_rays[from] );
      BBAnd( bb_chk, bb_chk, bb_move_to );

      while( BBTest( bb_chk ) )
        {
          to = LastOne( bb_chk );
          Xor( to, bb_chk );
          *pmove++ = To2Move(to) | From2Move(from) | Piece2Move(lance)
            | Cap2Move(-BOARD[to]) | FLAG_PROMO;
        }
    }

add_behind_attacks( &bb_chk, idirec, sq_wk );

BBAnd()
で空き王手になるときの香車の移動先の位置をbb_chkに格納しています。
で、その後は香車の移動先が敵陣かどうかを判定せずに、
香車の成りの手を生成しています。
FLAG_PROMOが成りを表しています。


よって、Bonanzaは上記局面を▲2七香成で詰むと判断します。


ということで、空き王手の部分は以下のように修正した方が良いように思います。

      from = LastOne( bb_piece );
      Xor( from, bb_piece );

      idirec = (int)adirec[sq_wk][from];
      if ( idirec && is_pinned_on_white_king( ptree, from, idirec ) )
        {
          add_behind_attacks( &bb_chk, idirec, sq_wk );
        }
      else
        {
          bb_chk.p[0] = abb_w_gold_attacks[sq_wk].p[0];
        }
      bb_chk.p[1] = bb_chk.p[2] = 0;


この関数は3手詰めルーチンでも呼ばれているのですが、
通常探索時に実際にこの手を指すことはなかったので、
非合法手はうまい具合に指さないようになっている様子。
dfpn server を動作させたときも大丈夫なのかな?


と、全体的な事情がよく分からないけれど、
とりあえずバグ報告しておいた。


追記
返信頂いた。やっぱりバグらしい。