Чтение онлайн

на главную

Жанры

Программирование на языке Пролог для искусственного интеллекта

Братко Иван

Шрифт:

Программа на рис. 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
рейтинг книги
Сопряжение 9

На три фронта

Бредвик Алекс
3. Иной
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
На три фронта

Авиатор: назад в СССР 11

Дорин Михаил
11. Покоряя небо
Фантастика:
альтернативная история
5.00
рейтинг книги
Авиатор: назад в СССР 11

Санек

Седой Василий
1. Санек
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Санек

Лорд Системы 8

Токсик Саша
8. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 8

Мерзавец

Шагаева Наталья
3. Братья Майоровы
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
5.00
рейтинг книги
Мерзавец

Игра топа. Между двух огней

Вяч Павел
2. Игра топа
Фантастика:
фэнтези
7.57
рейтинг книги
Игра топа. Между двух огней

Провинциал. Книга 2

Лопарев Игорь Викторович
2. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 2

Идущий в тени 6

Амврелий Марк
6. Идущий в тени
Фантастика:
фэнтези
рпг
5.57
рейтинг книги
Идущий в тени 6

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Идеальный мир для Лекаря 10

Сапфир Олег
10. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 10