# 微分可能 N-Queens ソルバー

この例では、**Tensor Logic** と微分可能プログラミングを用いて N-Queens 問題を解く方法を示します。バックトラッキングを使用する代わりに、盤面を確率分布として扱い、無効な配置にペナルティを与える損失関数を最小化します。

## 問題設定
$N \times N$ の盤面に $N$ 個のクイーンを、互いに攻撃し合わないように配置します。
クイーンは縦、横、斜めに移動（攻撃）できます。

## 手法
1.  **盤面表現**: 盤面は $N \times N$ のテンソル（学習可能なロジット）として表現されます。
2.  **ソフト制約 (Softmax)**: 「各行にクイーンは1つ」という制約を強制するため、行ごとに `softmax` を適用します。これにより、ロジットは各行の合計が 1 になる確率に変換されます。
3.  **損失関数**:
    *   **列の損失 (Column Loss)**: 各列の確率の合計が 1.0 から乖離した場合にペナルティを与えます。
    *   **対角線の損失 (Diagonal Loss)**: 任意の対角線上の確率の合計が 1.0 を超えた場合にペナルティを与えます (`relu(sum - 1.0)^2` を使用)。
4.  **最適化**: 勾配降下法を用いて総損失を最小化します。

## コードのポイント
*   **Tensor Comprehensions**: 手動のインデックスループなしで対角和を効率的に抽出するために使用しています。
    ```rust
    let anti_diag_sums = [k | k <- 0..(2 * N - 1), r <- 0..N, c <- 0..N, r + c == k { probs[r, c] }];
    ```
*   **自動微分 (Automatic Differentiation)**: 離散問題を連続緩和したモデルに対し、ソルバーが自動的に勾配を計算します。
*   **CLI 引数**: コマンドライン引数で `N` (サイズ) と `解の数` を指定できます。

## 使用方法

ソルバーの実行:

```bash
# デフォルト (N=8, 解10個)
cargo run --release -- examples/tasks/tensor_logic/n_queens/n_queens.tl

# カスタム設定 (例: N=4, 解2個)
cargo run --release -- examples/tasks/tensor_logic/n_queens/n_queens.tl -- 4 2
```
