Миниатюрный интерпретатор языка al0.
Миниатюрный интерпретатор языка AL0.
игра( Поз)
где Поз - выбранная начальная позиция. Если в позиции Поз ходит противник, то программа принимает его ход, в противном случае - "консультируется" с таблицей советов, приложенной к программе, порождает форсированное дерево и делает свой ход в соответствии с этим деревом. Так продолжается до окончания игры, которое обнаруживает предикат конец_игры (например, если поставлен мат).
Форсированное дерево - это дерево ходов, представленное в программе следующей структурой:
Ход . . [ Ответ1 . . Фдер1, Ответ2 . . Фдер2, . . . ]
Здесь ".." - инфиксный оператор; Ход - первый ход "игрока"; Ответ1, Ответ2, ... - возможные ответы противника; Фдер1, Фдер2, ... - форсированные поддеревья для каждого из этих ответов.
Программа на языке советов для эндшпиля"король и ладья против короля"
2. Программа на языке советов для эндшпиля
"король и ладья против короля"
Общий принцип достижения выигрыша королем и ладьей против единственной фигуры противника, короля, состоит в том, чтобы заставить короля отступить к краю доски или, при необходимости, загнать его в угол, а затем поставить мат в несколько ходов. В детальном изложении эта стратегия выглядит так:
line();Повторять циклически, пока не будет поставлен мат (постоянно проверяя, что не возникла патовая позиция и что нет нападения на незащищенную ладью):
(1) Найти способ поставить королю противника мат в два хода.
(2) Если не удалось, то найти способ уменьшить ту область доски, в которой
король противника "заперт" под воздействием ладьи.
(3) Если и это не удалось, то найти способ приблизить своего короля к королю
противника.
(4) Если ни один из элементарных советов 1, 2, или 3 не выполним, то найти
способ сохранить все имеющиеся к настоящему моменту "достижения" в
смысле (2) и (3) (т. е. сделать выжидающий ход).
(5) Если ни одна из целей 1, 2, 3 или 4 не достижима, то найти способ получить
позицию, в которой ладья занимает вертикальную или горизонтальную
линию, отделяющую одного короля от другого.
Описанные выше принципы реализованы во всех деталях в таблице советов на языке AL0, показанной на рис. 15.7. Эта таблица может работать под управлением интерпретатора рис. 15.6. Рис. 15.8 иллюстрирует смысл некоторых из предикатов, использованных в таблице советов, а также показывает, как эта таблица работает.
В таблице используются следующие предикаты:
Предикаты целей
мат мат королю противника
пат пат королю противника
потеря_ладьи король противника может взять ладью
ладья_под_боем
король противника может напасть на ладью прежде, чем наш
король сможет ее защитить
уменьш_простр
уменьшилось "жизненное пространство" короля противника,
ограничиваемое ладьей
раздел
ладья занимает вертикальную или горизонтальную линию,
разделяющую королей
ближе_к_клетке наш король приблизился к "критической клетке" (см. рис. 15.9),
т.е. манхеттеновское расстояние до нее уменьшилось
l_конфиг "L-конфигурация" (рис. 15.9)
простр_больше_2 "жизненное пространство" короля противника занимает
больше двух клеток
Предикаты, ограничивающие ходы
глубина = N
ход на глубине N дерева поиска
разреш
любой разрешенный ход
ход_шах
ход, объявляющий шах
ход_ладьей
ход ладьей
нет_хода
ни один ход не подходит
сначала_диаг
ход королем, преимущественно по диагонали
% Окончание "король и ладья против короля" на языке AL0
% Правила
правило_края:
если король_противника_на_краю и короли_рядом
то [мат_2, потеснить, приблизиться,
сохранить_простр, отделить_2, отделить_3].
иначе_правило
если любая_поз
то [ потеснить, приблизиться, сохранить_простр,
отделить_2, отделить_3].
% Элементарные советы
совет( мат_2,
мат :
не потеря_ладьи и король_противника_на_краю:
(глубина = 0) и разреш
затем (глубина = 2) и ход_шах :
(глубина = 1) и разреш ).
совет( потеснить,
уменьш_простр и не ладья_под_боем и
раздел и не пат :
не потеря_ладьи :
(глубина = 0) и ход_ладьей :
нет_хода ).
совет( приблизиться,
ближе _к_клетке и не ладья_под_боем и
(раздел или l_конфиг) и
(простр_больше_2 или не наш_король_на_краю):
не потеря_ладьи :
(глубина = 0) и сначала_диаг :
нет_хода ).
совет( сохранить_простр,
ход_противиика и не ладья_под_боем и раздел
и не_дальше_от_ладьи и
(простр_больше_2 или не наш_король_на_краю):
не потеря_ладьи :
(глубина = 0) и сначала_диаг :
нет_хода ).
совет( отделить_2,
ход_противника и раздел и не ладья_под_боем:
не потеря_ладьи :
(глубина < 3) и разреш :
(глубина < 2) и разреш ).
совет( отделить_3,
ход_противника и раздел и не ладья_под_боем:
не потеря_ладьи :
(глубина < 5) и разреш :
(глубина < 4) и разреш ).