сосед_чсл( Y, Y1).
сосед_гор( X : Y, X1 : Y) :-
% Соседние клетки по горизонтали
сосед_чсл( X, X1).
сосед( S, S1) :-
% Соседние клетки (предпочтение - диагонали)
сосед_диаг( S, S1);
сосед_гор( S, S1);
сосед_верт( S, S1).
конец_игры( Поз) :-
мат( Поз).
% Предикаты, ограничивающие ходы
% Специализированное генераторы ходов вида:
% ход( Ограничение, Поз, Ход, Поз1)
ход( глубина < Макс, Поз, Ход, Поз1) :-
глуб( Поз, Г),
Г < Макс, !.
ход( глубина = Г, Поз, Ход, Поз1) :-
глуб( Поз, Г), !.
ход( сначала диаг, б..Б..Л..Ч..Г, Б-Б1,
ч..Б1..Л..Ч..Г1) :-
Г1 is Г + l,
сосед( Б, Б1),
% "сосед" порождает сначала диагональные ходы
not сосед( Б1, Ч), % Не попасть под шах
Б1 \== Л. % Не столкнуться с ладьей
ход( ход ладьей, б..Б..Лх : Лу..Ч..Г, Лх : Лу-Л,
ч..Б..Л..Ч..Г1) :-
Г1 is Г + 1,
коорд( I), % Число между 1 и 8
( Л = Лх : I; Л = I : Лу),
% По горизонтали или по вертикали
Л \== Лх : Лу, % Обязательно двигаться
not мешает( Лх : Лу, Б, Л). % Мешает белый король
ход( ход_шах, Поз, Л-Лх : Лу, Поз1) :-
бл( Поз, Л),
чк( Поз, Чх : Чу),
( Лх = Чх; Лу = Чу),
% Ладья и черный король на одной линии
ход( ход_ладьей, Поз, Л-Лх : Лу, Поз1).
ход( разреш, б..П, М, П1) :-
( Огр = сначала_диаг; Огр = ход ладьей),
ход( Огр, б..П, М, П1).
ход( разреш, ч..Б..Л..Ч..Г, Ч-Ч1, б..Б..Л..Ч1..Г1) :-
Г1 is Г + 1,
сосед( Ч, Ч1),
not шах( б..Б..Л..Ч1..Г1).
разрход( Поз, Ход, Поз1) :-
ход( разреш, Поз, Ход, Поз1).
шах( _..Б..Лх : Лу..Чх : Чу.._ ) :-
сосед( Б, Чх : Чу); % Короли рядом
( Лх = Чх; Лу = Чу),
Лх : Лу \== Чх : Чу, % Нет взятия ладьи
not мешает( Лх : Лу, Б, Чх : Чу).
мешает( S, S1, S1) :- !.
мешает( X1 : Y, X2 : Y, Х3 : Y) :-
упоряд( X1, Х2, Х3), !.
мешает( X : Y1, X : Y2, X : Y3) :-
упоряд( Y1, Y2, Y3).
упоряд( N1, N2, N3) :-
N1 < N2, N2 < N3;
N3 < N2, N2 < N1.
коорд( 1). коорд( 2). коорд( 3). коорд( 4).
коорд( 5). коорд( 6). коорд( 7). коорд( 8).
% Предикаты целей
любая_поз( Поз).
ход_противника( б.._ ). % Противник ходит белыми
мат( Поз) :-
чей_ход( Поз, ч),
шах( Поз),
not разрход( Поз, _, _ ).
пат( Поз) :-
чей_ход( Поз, ч),
not шах( Поз),
not разрход( Поз, _, _ ).
уменьш_простр( Поз, КорнПоз) :-
простр( Поз, Пр),
простр( КорнПоз, КорнПр),
Пр < КорнПр.
ладья_под_боем( ЧейХод..Б..Л..Ч.._ ) :-
расст( Б, Л, P1),
расст( Ч, Л, Р2),
( ЧейХод = б, !, P1 > Р2 + 1;
ЧейХод = ч, !, P1 > Р2 ).
ближе_к_клетке( Поз, КорнПоз) :-
расст_до_клетки( Поз, P1),
расст_до_клетки( КорнПоз, Р2),
P1 < Р2.
расст_до_клетки( Поз, Мрасст) :-
% Манхеттеновское расстояние
бк( Поз, БК), % между БК и критической клеткой