Программирование на языке Пролог для искусственного интеллекта
Шрифт:
Программа на рис. 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( ИмяСовета),
выполн_совет( ИмяСовета, Поз, ФорсДер), !.
выполн_совет( ИмяСовета, Поз, Фдер) :-
совет( ИмяСовета, Совет),
% Найти элементарный совет
выполн( Совет, Поз, Поз, ФДер).
% "выполн" требует две позиции для сравнивающих предикатов
выполн( Совет, Поз, КорнПоз, ФДер) :-
поддержка( Совет, ЦП),
удовл( ЦП, Поз, КорнПоз),
% Сопоставить Поз с целью-поддержкой
выполн1( Совет, Поз, КорнПоз, ФДер).
выполн1( Совет, Поз, КорнПоз, nil) :-
главцель( Совет, ГлЦ),
удовл( ГлЦ, Поз, КорнПоз), !.
% Главная цель удовлетворяется
выполн1( Совет, Поз, КорнПоз, Ход .. ФДеревья) :-
чей_ход( Поз, б), !, % Программа играет белыми
ходы_игрока( Совет, ХодыИгрока),
% Ограничения на ходы игрока
ход( ХодыИгрока, Поз, Ход, Поз1),
% Ход, удовлетворяющий ограничению
выполн( Совет, Поз1, КорнПоз, ФДеревья).
выполн1( Совет, Поз, КорнПоз, ФДеревья) :-
чей_ход( Поз, ч), !, % Противник играет черными
ходы_противника( Совет, ХодыПр),
bagof ( Ход .. Поз1, ход( ХодыПр, Поз, Ход, Поз1), ХПспис),
выполн_все( Совет, ХПспис, КорнПоз, ФДеревья).
% Совет выполним во всех преемниках Поз
выполн_все( _, [], _, []).
Поделиться:
Популярные книги
Кровь Василиска
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Венецианский купец
1. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
7.31
рейтинг книги
Сопряжение 9
9. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
технофэнтези
рпг
5.00
рейтинг книги
На три фронта
3. Иной
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Авиатор: назад в СССР 11
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Санек
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Лорд Системы 8
8. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Мерзавец
3. Братья Майоровы
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
5.00
рейтинг книги
Игра топа. Между двух огней
2. Игра топа
Фантастика:
фэнтези
7.57
рейтинг книги
Провинциал. Книга 2
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Идущий в тени 6
6. Идущий в тени
Фантастика:
фэнтези
рпг
5.57
рейтинг книги
На границе империй. Том 9. Часть 4
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Крестоносец
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Идеальный мир для Лекаря 10
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00