QuasiGroup 補完問題では、2 つのモデルを実装しました。そのうちの 1 つは、チャネリング制約のみに基づくモデルです (Dotu による調査に基づく)。もう 1 つは、すべての値がすべての行/列で発生する必要があるという事実に基づくモデルです。ここに小さなスクリプトがあります:
flag :- fail.
:- lib(ic).
:- import occurrences/3 from ic_global.
test :-
O is 9, % Order of the puzzle
dim(Variables, [O,O]), Variables :: 1..O,
6 is Variables[1,1], 8 is Variables[6,2],
dim(Dual1, [O,O]), Dual1 :: 1..O,
dim(Dual2, [O,O]), Dual2 :: 1..O,
(flag ->
(multifor([I,V], 1, O), param(Variables, O) do
ic_global:occurrences(V, Variables[I,1..O], 1),
ic_global:occurrences(V, Variables[1..O,I], 1)
)
;
(multifor([I,J,K], 1, O), param(Variables, Dual1, Dual2) do
#=(Variables[I,J], K, Bool),
#=(Dual1[I,K], J, Bool),
#=(Dual2[J,K], I, Bool)
)
),
search(Variables, 0, input_order, indomain, complete, [backtrack(Backtracks)]),
write(Variables), nl,
write('Backtracks : '), write(Backtracks), nl.
たくさんのベンチマーク (10 個以上のパズル) で試してみました。バックトラックの総数は 500 を超えていますが、驚いたのは、両方のモデルでその数が同じであることです。セット内の各問題のバックトラック数も同じです。
上記の小さなスクリプトも、同じ数のバックトラックを報告します。なぜこれが起こるのか興味があります。ic_global:occurrences/
これほど似たような動作をさせるにはどうすればよいでしょうか (少し遅くなりますが)。