Читаем Prolog полностью

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


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


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


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


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

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

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


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

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

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


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


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


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


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


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


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


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


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


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

        выполн_совет( ИмяСовета, Поз, Фдер) :-


                совет( ИмяСовета, Совет),


                                        % Найти элементарный совет


                выполн( Совет, Поз, Поз, ФДер).


                % "выполн" требует две позиции для сравнивающих предикатов

        выполн( Совет, Поз, КорнПоз, ФДер) :-


                поддержка( Совет, ЦП),


                удовл( ЦП, Поз, КорнПоз),


                                        % Сопоставить Поз с целью-поддержкой


                выполн1( Совет, Поз, КорнПоз, ФДер).

        выполн1( Совет, Поз, КорнПоз, nil) :-


                главцель( Совет, ГлЦ),


                удовл( ГлЦ, Поз, КорнПоз),  !.


                                        % Главная цель удовлетворяется

        выполн1( Совет, Поз, КорнПоз, Ход .. ФДеревья) :-


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


                ходы_игрока( Совет, ХодыИгрока),


                                        % Ограничения на ходы игрока


                ход( ХодыИгрока, Поз, Ход, Поз1),


                                        % Ход, удовлетворяющий ограничению


                выполн( Совет, Поз1, КорнПоз, ФДеревья).

        выполн1( Совет, Поз, КорнПоз, ФДеревья) :-


                чей_ход( Поз, ч),  !,                                 % Противник играет черными


                ходы_противника( Совет, ХодыПр),


                bagof ( Ход . . Поз1, ход( ХодыПр, Поз, Ход, Поз1), ХПспис),


                выполн_все( Совет, ХПспис, КорнПоз, ФДеревья).


                                        % Совет выполним во всех преемниках Поз

        выполн_все( _, [ ], _, [ ]).

        выполн_все( Совет, [Ход . . Поз | ХПспис], КорнПоз,


                                                                [Ход . . ФД | ФДД] ) :-


                выполн( Совет, Поз, КорнПоз, ФД),


                выполн_все( Совет, ХПспис, КорнПоз, ФДД).

% Интерпретация главной цели и цели-поддержки:


% цель - это И / ИЛИ / НЕ комбинация. имен предикатов

        удовл( Цель1 и Цель2, Поз, КорнПоз) :-  !,


                удовл( Цель1, Поз, КорнПоз),


                удовл( Цель2, Поз, КорнПоз).

        удовл( Цель1 или Цель2, Поз, КорнПоз) :-  !,


                ( удовл( Цель1, Поз, КорнПоз);


                удовл( Цель2, Поз, КорнПоз) ).

        удовл( не Цель, Поз, КорнПоз) :-  !,


                not удовл( Цель, Поз, КорнПоз ).

        удовл( Пред, Поз, КорнПоз) :-


                ( Усл =.. [Пред, Поз];


                                            % Большинство предикатов не зависит от КорнПоз


                    Усл =.. [Пред, Поз, КорнПоз] ),


                call( Усл).

% Интерпретация ограничений на ходы

        ход( Ходы1 и Ходы2, Поз, Ход, Поз1) :-  !,


                ход( Ходы1, Поз, Ход, Поз1),


                ход( Ходы2, Поз, Ход, Поз1).

        ход( Ходы1 затем Ходы2, Поз, Ход, Поз1) :-  !,


                ( ход( Ходы1, Поз, Ход, Поз1);


                  ход( Ходы2, Поз, Ход, Поз1) ).

% Доступ к компонентам элементарного совета

        главцель( ГлЦ : _, ГлЦ).

        поддержка( ГлЦ : ЦП : _, ЦП).

        ходы_игрока( ГлЦ : ЦП : ХодыИгрока : _, Ходы Игрока).

        ходы_противника( ГлЦ : ЦП: ХодыИгр : ХодыПр :_,


                                          ХодыПр).

        принадлежит( X, [X | Спис]).

        принадлежит( X, [Y | Спис]) :-


                принадлежит( X, Спис).

Рис. 15. 6.  Миниатюрный интерпретатор языка AL0.

        игра( Поз)

Перейти на страницу:

Похожие книги

Слово о полку Игореве
Слово о полку Игореве

Исследование выдающегося историка Древней Руси А. А. Зимина содержит оригинальную, отличную от общепризнанной, концепцию происхождения и времени создания «Слова о полку Игореве». В книге содержится ценный материал о соотношении текста «Слова» с русскими летописями, историческими повестями XV–XVI вв., неординарные решения ряда проблем «слововедения», а также обстоятельный обзор оценок «Слова» в русской и зарубежной науке XIX–XX вв.Не ознакомившись в полной мере с аргументацией А. А. Зимина, несомненно самого основательного из числа «скептиков», мы не можем продолжать изучение «Слова», в частности проблем его атрибуции и времени создания.Книга рассчитана не только на специалистов по древнерусской литературе, но и на всех, интересующихся спорными проблемами возникновения «Слова».

Александр Александрович Зимин

Древнерусская литература / Прочая старинная литература / Прочая научная литература / Древние книги / Литературоведение / Научная литература