【问题标题】:Prolog - N-Queens quiz - infinite loopProlog - N-Queens 测验 - 无限循环
【发布时间】:2014-06-22 15:23:24
【问题描述】:

这是关于8-Queens problem。 我正在尝试解决更通用的 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).

我知道这可能不是最好的解决方案,但我可以使用一些帮助来了解这里出了什么问题。

【问题讨论】:

    标签: prolog infinite-loop n-queens failure-slice


    【解决方案1】:

    以下是相关的程序片段:

    解决方案(L,N):-
       法律解决方案(L),
       长度(L,N1),
       N1=N。
    
    法律解决方案(L):-
        长度(L,长度),范围(1,长度,排序)permutation(Sorted, L),
        legal_solution_aux(L).

    这个片段 () 已经为类似solution(L,4) 的查询循环,因此您的整个程序也将循环。您需要修改可见部分中的某些内容。我建议:

    solution(L, N) :-
       length(L, N),
       legal_solution(L).
    

    否则,您会大量使用削减,这通常会限制声明式调试技术的适用性。这里不需要。

    【讨论】:

      猜你喜欢
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多