#はじめに
『Rubyで数独:AIプログラミング入門』の「セルの予約」の説明で使っている表の記法と解説をまとめる目的でこのノートは書いています。本の中で使っているパズルは数独通信からひっぱってきているので、そのままではあれなので無料で入手可能なOpen Sudokuのパズルに変更しています。
#解説
Open SudokuのHARDのステージ67をある程度まで進めた図が次の左の図になります。この状況から先に進むのに「セルの予約」というテクニックが使えます。
左にある数独の画面の7行目でセルの予約が使えます。
右にある表は7行目のマスを縦軸に、その値を横軸にとっています。A7の値は4です。これを右の表の1行目4列目に◯を打つことで表現します。
A7はその他の値にはなりえないという意味で、右の表の1行目の他の部分を✕で埋めています。
B7, D7, E7, G7の行もA7の行と同様の意味で埋まります。
次にC7はC列にすでに1, 5があるので$C7 \notin \{1, 5\}$。同様にI7もI列に1, 5があるので$I7 \notin \{1, 5\}$。これを右の表に❏で書きます(❏も意味的には✕と同じくその値にはなりえない)。
すると、数独の7行目で1になりうるのは右の表を見るとF7かH7で、5も同様です。これを△、▲で表を埋めます。
ここで▲、△の意味は次のように定義します。
▲, △ \in \{◯, ✕ \}, ~~~▲ \neq △
簡単に言えば△と▲は△が◯ならば▲は✕をとり、△が✕ならば▲は◯を取るということです。右の表のC7の行とF7の行は1列目か5列目に◯が入るので、・の部分はXになります。・をXにするテクニックを「セルの予約」と言います。