Пролог - N-Queens викторина - бесконечный цикл

Это касается проблемы 8-куин. Я пытаюсь решить более общую проблему 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).

Я знаю, что это, вероятно, не лучшее решение, но я мог бы использовать некоторую помощь, чтобы понять, что здесь пошло не так.

1 ответ

Решение

Вот соответствующий фрагмент программы:

раствор (L, N): -
   legal_solution (L), false
   длина (L, N1),
   N1 = N. legal_solution (L) -
    длина (L, длина), ложь,
    диапазон (1, длина, сортировка),
    перестановка (отсортировано, L),
    legal_solution_aux (L).

Этот фрагмент ( fail-slice) уже зацикливается для запроса типа solution(L,4) и, следовательно, вся ваша программа будет зацикливаться. Вам нужно изменить что-то в видимой части. Я бы предложил:

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

В противном случае вы интенсивно используете сокращения, которые часто ограничивают применимость методов декларативной отладки. Здесь нет необходимости.

Другие вопросы по тегам