ЯЗык "Пролог". Понятие базы знаний, определение. Задачи и упражнения, страница 17

/♦л******************************************************/ вопрос(Предположение):счетчик (Счетчик) , clear-window, nl, nl,

write("Сколько быков и коров в числе "), выв_числа(Предположение),wri te("?"),nl,

write("XtEbiKOB (цифр на своих местах)?"),readint(Быки),

write("\tKopoB (цифр не на своих местах)?"),readint(Коровы),nl, допустимо(Быки,Коровы),!,

asserta(запрос(Предположение,Быки,Коровы)),

Счвтчик1=Счетчик+1,

asserta(бд_счетчик(Счетчик1)),

Быки=4.

/**А************** ******* ■* ****+**************** **********/

%   3.2.1. Вывод числа-предположения

/***** ♦******* + **<.************♦♦***♦****■*■***♦♦***********/

выв_числа([ ]):-!.

выв_числа([Х|Y]):-write(X),выв_числа(Y).

/******♦**♦********************** к***********■********* + **/ %   3.2.2. Проверка на допустимость числа быков и коров

/**♦********♦*****♦*****♦***********♦***♦***♦+**♦********/

допустимо(Быки,Коровы):-Быки+Коровы<=4.

/А*-********************»*********************************/

%   4. Сообщение

/* ************************* *************** + **************/

сообщение:findall(N,6fl_C4eT4HK(N),W),cyM(W,NN),

write("Ответ найден после ",NN," запросов").

/***♦*****•♦******■**♦*******♦*****************************/ %  4.1. Подсчет количества вопросов

I -к*******************************************************/

счетчик(0).               %инициализация счетчика оум([],0).

сум([Х|XI],N)!-сум(XI,N1),N=N1+1.

у********************************************************/

%                 Вспомогательные предикаты у********************************************************/

пауза:-nl,write("Нажмите любую клавишу"),readchar(_).


8.3. "Ним"

/it***********************************к*******************/

%                     Игра "Ним"

/♦л******************************************************/

%В игре используются спички, разложенные в N кучек. Игроки %поочередно берут из любой кучки произвольное число спичек %(можно все). Побеждает игрок, который берет последнюю %спичку.

/it*************************** а-***************************/

DOMAINS

ход=ход(число,число)

спие=з tring*

числ cnnc=integer*

игрок=компыотер;игрок

число=д.пЪедег

crpoKa=3tring

PREDICATES

игра(строка)

инициализировать(строка,числ_спис,строка)

отобраэить_игру(числ_спис,строка)

играть(числ_спис,строка,строка)

игра_окончена(числ спис,строка,строка)

объявить(строка)

выбрать_х.од (числ_опис, строка, ход)

ходить(ход,числ_спис,числ_спис)

другой_игрок(строка,строка)

читать(ход)

опасная(числ_спис,числ_спис)

безопасный_ход(числ_спис,числ_спис,ход)

безоп_ход(числ_спис,числ_спис,число,ход)

безопасная(числ_спис)

ним_сумма(числ_спис,числ_спис,числ_спис)

нуль(числ_спис)

двоичное(число,числ_спис)

ним_сложение(числ_спис,числ_спис,числ_спис)

десятичное(числ_спис,число)

дес(чиол_спио,число,число,число)

может_быть_нуль(«иол_сгшс,числ спис,числ_спис,число)

DATABASE - ним ход(число,число)

clauses

/♦*♦*#******♦************♦******************#************/

%              Предикаты верхнего уровня

/*******************************♦*************♦**********/


игра(Игра):инициализировать(Игра,Позиция,Игрок), отобразить_игру(Позиция,Игрок), играть(Позиция,Игрок,Результат).

I *******♦************************♦***********♦***********/

%                Инициализация игры

/л*******************************************************/

инициализировать(ним,[3,4,5],противник).

/****************+>****•**********•****•*****+*•*********/

%            Отображение игры на экране

/******************************************♦***♦*********/

отобразить_игру(Позиция,Игрок):-write(Позиция),nl,nl.

/*•** + ***** ***************************+**■****+*******+***/

%                       Игра

/*********а+********+***+********** а*********************/

играть(Позиция,Игрок,Результат):игра_окончена(Позиция,Игрок,Результат),!, объявить(Результат). играть(Позиция,Игрок,Результат):выбрать ход(Позиция,Игрок,Ход), ходить(Ход,Позиция,Позиция1), отобразить_игру(Позиция!,Игрок), другой_игрок(Игрок,Игрок1),! , играть(Поэиция1,Игрок!,Результат).

/л*******************************************************/ %             Условие окончания игры %                список кучек пуст

/*************************♦*******♦****♦*****************/

игра_окончена([],Игрок,Игрок).

/************************* ************** ****♦*****+******/

%                     Выбор хода

/****************************************************** **/

выбрать_ход(Позиция,противник,Ход):write("Сделайте ход"),п1, читать(Ход).                       %Ход человека выбрать_ход(Ns,компьютер,Ход):опасная(Ns,Сумма),                  %Оценка позиции беэопасный_ход(Ns,Сумма,Ход).        %Ход компьютера выбрать_ход(Ns,компьютер,ход(1,1)):-   %Произвольный ход безопасная(Ns).                    %компьютера, если

%позиция безопасная