-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlabwork_2.pl
21 lines (18 loc) · 2.35 KB
/
labwork_2.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
solution(Ylist) :-
sol(Ylist, % Ylist - Y-координаты ферзей
[1, 2, 3, 4, 5, 6, 7, 8], % Dx, область определения X-координат
[1, 2, 3, 4, 5, 6, 7, 8], % Dy, область определения Y-координат
[-7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7], % Du, диагонали идущие снизу вверх (восходящие)
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]). % Dv, диагонали идущие сверху вниз (нисходящие)
% Отношение, которое конкретизирует Y-координаты (Если больше нет X-ов, то и Y-ов тоже, соответственно)
sol([], [], Dy, Du, Dv). % Критерий остановки
sol([Y | Ylist], [X | Dx1], Dy, Du, Dv) :- %
delete(Y, Dy, Dy1), % Удаление использованной Y-координаты из списка Dy
U is X - Y, % Вычисление соответствующей восходящей диагонали
delete(U, Du, Du1), % Удаление восходящей диагонали
V is X + Y, % Вычисление соответствующей нисходящей диагонали
delete(V, Dv, Dv1), % Удаление нисходящей диагонали
sol(Ylist, Dx1, Dy1, Du1, Dv1). % Рекурсивный вызов, выбор из оставшихся значений (хвост списка Ylist и новые списки Dy1, Du1, Dv1)
delete(Item, [Item | List], List). % Критерий остановки
delete(Item, [First | List], [First | List1]) :- %
delete(Item, List, List1). % Рекурсивный вызов, ищем искомый элемент в хвосте списка List