выполн_все( _, [ ], _, [ ]).
выполн_все( Совет, [Ход . . Поз | ХПспис], КорнПоз,
[Ход . . ФД | ФДД] ) :-
выполн( Совет, Поз, КорнПоз, ФД),
выполн_все( Совет, ХПспис, КорнПоз, ФДД).
% Интерпретация главной цели и цели-поддержки:
% цель - это И / ИЛИ / НЕ комбинация. имен предикатов
удовл( Цель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.
игра( Поз)
где Поз - выбранная начальная позиция. Если в позиции Поз ходит противник, то программа принимает его ход, в противном случае - 'консультируется' с таблицей советов, приложенной к программе, порождает форсированное дерево и делает свой ход в