15.6. Программа на языке  AL0 для игры в шахматном эндшпиле

При реализации какой-либо игровой программы на языке  AL0  ее можно для удобства разбить на три модуля:

(1) интерпретатор языка  AL0,

(2) таблица советов на языке  AL0,

(3) библиотека предикатов, используемых в таблице советов (в том числе предикаты, задающие правила игры).

Эта структура соответствует обычной структуре системы, основанной на знаниях:

• Интерпретатор  AL0  выполняет функцию машины логического вывода.

• Таблица советов вместе с библиотекой предикатов образует базу знаний.

15.6.1. Миниатюрный интерпретатор языка AL0

Реализация на Прологе миниатюрного, не зависящего от конкретной игры интерпретатора языка AL0 показана на рис. 15.6. Эта программа осуществляет также взаимодействие с пользователем во время игры. Центральная задача этой программы — использовать знания, записанные в таблице советов, то есть интерпретировать программу на языке советов AL0 с целью построения форсированных деревьев и их 'исполнения' в процессе игры. Базовый алгоритм порождения форсированных деревьев аналогичен поиску с предпочтением в И/ИЛИ-графах гл. 13, при этом форсированное дерево соответствует решающему И/ИЛИ-дереву. Этот алгоритм также напоминает алгоритм построения решающего дерева ответа на вопрос пользователя, применявшийся в оболочке экспертной системы (гл. 14).

Программа на рис. 15.6 составлена в предположении, что она играет белыми, а ее противник — черными. Программа запускается процедурой

игра( Поз)

где Поз — выбранная начальная позиция. Если в позиции Поз ходит противник, то программа принимает его ход, в противном случае — 'консультируется' с таблицей советов, приложенной к программе, порождает форсированное дерево и делает свой ход в соответствии с этим деревом. Так продолжается до окончания игры, которое обнаруживает предикат конец_игры (например, если поставлен мат).

% Миниатюрный интерпретатор языка AL0

%

% Эта программа играет, начиная с заданной позиции,

% используя знания, записанные на языке AL0

:- op( 200, xfy, :).

:- op( 220, xfy, ..).

:- op( 185, fx, если).

:- op( 190, xfx, то).

:- op( 180, xfy, или).

:- op( 160, xfy, и).

:- op( 140, fx, не).

игра( Поз) :-         % Играть, начиная с Поз

 игра( Поз, nil).

  % Начать с пустого форсированного дерева

игра( Поз, ФорсДер) :-

 отобр( Поз),

 ( конец_игры( Поз),  % Конец игры?

   write( 'Конец игры'), nl, !;

 сделать_ход( Поз, ФорсДер, Поз1, ФорсДер1), !,

 игра( Поз1, ФорсДер1) ).

% Игрок ходит в соответствии с форсированным деревом

сделать_ход( Поз, Ход .. ФДер1, Поз1, ФДер1) :-

 чей_ход( Поз, б),    % Программа играет белыми

 разрход( Поз, Ход, Поз1),

 показать_ход( Ход).

% Прием хода противника

сделать_ход( Поз, ФДер, Поз1, ФДер1) :-

 чей_ход( Поз, ч),

 write( 'Ваш ход:'),

 read( Ход),

 ( разрход( Поз, Ход, Поз1),

   поддер( ФДер, Ход, ФДер1), !;

    % Вниз по форс. дереву

 write( 'Неразрешенный ход'), nl,

 сделать_ход( Поз, ФДер, Поз1, ФДер1) ).

% Если текущее форсированное дерево пусто, построить новое

сделать_ход( Поз, nil, Поз1, ФДер1) :-

 чей_ход( Поз, б),

 восст_глуб( Поз, Поз0),

  % Поз0 = Поз с глубиной 0

 стратегия( Поз0, ФДер), !,

  % Новое форсированное дерево

 сделать_ход( Поз0, ФДер, Поз1, ФДер1).

% Выбрать форсированное поддерево, соответствующее Ход'у

поддер( ФДеревья, Ход, Фдер) :-

 принадлежит( Ход . . Фдер, ФДеревья), !.

поддер( _, _, nil).

стратегия( Поз, ФорсДер) :-

  % Найти форс. дерево для Поз

 Прав : если Условие то СписСов,

  % Обращение к таблице советов

 удовл( Условие, Поз, _ ), !,

  % Сопоставить Поз с предварительным условием

 принадлежит( ИмяСовета, СписСов),

  % По очереди попробовать элем. советы

 nl, write( 'Пробую'), write( ИмяСовета),

 выполн_совет( ИмяСовета, Поз, ФорсДер), !.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату