8-Queens問題についてです。より一般的な N-Queens 問題を解決しようとしています。
目標は、このルールで考えられるすべての答えを表示することです。例えば:
solution(Sol,4).
X = [2, 4, 1, 3] ;
X = [3, 1, 4, 2] ;
false.
私はすべての答えとすべてを正しく得ることができましたが、何らかの理由で、私のコードは最後の解決策の後に無限ループに入ります.
これは私がこれまでに書いたものです:
no_threat(Queen1, Queen2, Dist):-
Queen1=\=Queen2,
Queen1>0, Queen2>0,
Dist=\=Queen2-Queen1,
Dist=\=Queen1-Queen2,!.
queen_safe_aux(_, [], _):- true,!.
queen_safe_aux(Queen, [L|Ls], Dist):-
no_threat(Queen, L, Dist),
Dist2 is Dist+1,
queen_safe_aux(Queen, Ls, Dist2).
queen_safe(Queen, L):- queen_safe_aux(Queen, L, 1).
legal_solution_aux([]):-true,!.
legal_solution_aux([L|Ls]):- queen_safe(L,Ls),legal_solution_aux(Ls).
legal_solution(L):-
length(L, Length),
range(1, Length, Sorted),
permutation(Sorted, L),
legal_solution_aux(L).
solution(L,N):-legal_solution(L),length(L,N1),N1=N.
これは、ソリューションに使用した範囲ルールです (正しいです)。
range(From, From, [From]):- true, !.
range(From, To, [From|Ls]):- From < To, From2 is From+1, range(From2, To, Ls).
これがおそらく最善の解決策ではないことはわかっていますが、ここで何がうまくいかなかったのかを理解するのに役立つことがあります。