Конец_игры( Поз) :-мат( Поз).

Сосед_гор( X : Y, X1 : Y) :- % Сусідні клітки по горизонталі сосед_чсл( X, X1).

Сосед_верт( X : Y, X : Y1) :- % Сусідні клітки по вертикалі сосед_чсл( Y, Y1).

Сосед_диаг( X : Y, X1 : Y1) :- % Сусідні клітки по діагоналі сосед_чсл( X, X1 ), сосед_чсл( Y, Y1).

Тепер доречно поставити деякі запитання.

По-перше, чи є наша програма-порадник коректною в тому розумінні, що вона ставить мат при будь-якому варіанті захисту з боку супротивника й при будь-якій початковій позиції, у якій на дошці король і тура проти короля? У статті Bratko (1978) наведений формальний доказ того, що таблиця порад дійсно є коректною в зазначеному смислі.

Інше можливе питання: чи є програма оптимальною, тобто чи вірно, що вона ставить мат за мінімальне число ходів? Неважко показати на прикладах, що гру нашої програми в цьому змісті не можна назвати оптимальною. Відомо, що оптимальний варіант у цім закінченні (той, що припускає оптимальну гру по обидва боки) має довжину не більш 16 ходів.

Хоча наша таблиця порад і далека від цього оптимуму, було показано, що число ходів напевно не перевищує 50. Це важливий результат у зв'язку з тим, що в шахах існує "правило 50-ти ходів": в ендшпілях типу "король і тура проти короля" супротивник, що має перевагу, повинен поставити мат не більш, ніж за 50 ходів; інакше може бути оголошена нічия.

 

% Бібліотека предикатів для закінчення "король і тура проти короля". Позиція представлена стуктурой:

 

% ЧейХод..Бх : Бу..Лх : Лу..Чх : Чу..Глуб
% ЧейХод - з чиєї сторони хід у цій позиції ('б' чи 'ч')
% Бх, Бу - координати білого короля
% Лх, Лу – координати білої тури
% Чх, Чу – координати чорного короля
% Глуб - глибина, на якій знаходиться ця позиція в дереві
% пошуку

 

% Відношення вибору елементів позиції

 

чей_ход( ЧейХод.._, ЧейХод).
бк( _..БК.._, БК). % Білий король
бл( _.._..БЛ.._, БЛ). % Біла тура
чк( _.._.._..ЧК.._, ЧК).% Чорний король
глуб( _.._.._.._..Глуб, Глуб).

восст_глуб( ЧХ..Б..Л..Ч..Г, ЧХ..Б..Л..Ч..0).
% Формується копія позиції, глубина встановлюється в 0

 

% Деякі відношення між клітками дошки

 

сосед_чсл( N, N1) :- % Сусіднє число "в межах дошки"
( N1 is N + 1;
N1 is N - 1 ),
внутри(N1).

внутри( N) :-
N > 0, N < 9.

сосед( 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).