这是关于 8-Queens problem 。 我正在尝试解决更通用的 N 皇后问题。
目标是让这条规则向我展示所有可能的答案。 例如:
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).
我知道这可能不是最好的解决方案,但我可以使用一些帮助来理解这里出了什么问题。
最佳答案
下面是相关的程序片段:
solution(L,N):- legal_solution(L), falselength(L,N1),N1=N. legal_solution(L):- length(L, Length), false,range(1, Length, Sorted),permutation(Sorted, L),legal_solution_aux(L).
This fragment (failure-slice) already loops for a query like solution(L,4)
and thus your entire program will loop as well. You need to modify something in the visible part. I'd suggest:
solution(L, N) :-
length(L, N),
legal_solution(L).
否则,您会大量使用剪切,这通常会限制声明式调试技术的适用性。这里不需要。
关于Prolog - N-Queens 测验 - 无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24352700/