Я изучаю Пролог в качестве универсального экзамена, и у меня возникли проблемы со следующим упражнением.
У меня есть следующее классическое решение проблемы 8-ферзей (и это не проблема для меня). Изменяя это решение, я должен создать новое решение для более общей проблемы n-Queens, которая обрабатывает переменное количество ферзей.
solution([]).
solution([X/Y|Others]) :- solution(Others),
member(Y,[1,2,3,4,5,6,7,8]),
noattack(X/Y, Others).
noattack(_,[]).
noattack(X/Y, [X1/Y1 | Others]) :-
Y =\= Y1, % Q e Q1 sono su righe diverse
% Q e Q1 sono su diagonali diverse:
Y1-Y =\= X1-X,
Y1-Y =\= X-X1,
% Q non attacca regine nella sottolista Others:
noattack( X/Y, Others).
% TEMPLATE DELLE SOLUZIONI: c'è una regina su ogni colonna:
template([1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8]).
Хорошо, эта программа выглядит довольно просто: у меня есть список королев, у которых они не должны атаковать друг друга.
Если список ферзей пуст, вероятность того, что ферзь атакует другого ферзя в списке, отсутствует, поэтому пустой список является решением проблемы (это базовый вариант решения)
* Если список ферзей не пуст, я могу разделить его на [X / Y | Others], где X / Y - текущая позиция на доске первого ферзя в списке * (позиция rappresentend парой (X, Y), где X - столбец, а Y - линия)
Итак, ИСТИНА, что список [X / Y | Others] является РЕШЕНИЕМ проблемы, если верны следующие соотношения:
Подсписок Others сам по себе является решением (другие не содержат ферзя, который атакует другого ферзя в списке)
Y принадлежит целому числу от 1 до 8 (потому что у меня 8 строк)
Первая ферзь в списке не атакует других ферзей в подсписке Others
Затем определяется отношение noattack, которое указывает, когда я могу сказать, что это правда, что ферзь не атакует другого ферзя (это довольно просто: они не могут оставаться на той же линии, на тот же столбец, на той же диагонали)
Наконец, у меня есть шаблон решения, который упрощает мою жизнь, ограничивая значение X значением от 1 до 8 (потому что я знаю, что 2 ферзя не могут оставаться на одних и тех же столбцах ... поэтому каждая ферзь в решение остается в столбце, отличном от всех остальных ферзей)
Поэтому я думаю, что самая большая проблема - в строке, в которой я указываю количество столбцов:
member(Y,[1,2,3,4,5,6,7,8])
и в строке, в которой я определяю шаблон решения:
template([1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8]).
Я понятия не имею, как расширить предыдущее решение для обработки переменного количества ферзей.