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


/ft*******************************************************/

%                 .    Ходчеловека

/А*******************************************************/

читать(Ход):-

write("Номеркучки - "), readint(Nl), write("Количествоспичек - "), readint(N2), Ход=ход(Ш.,Ы2).

/♦А********************* ************|1* *********** *******х«/

%                    Обработкахода

/♦♦A*****************************************************/

/А*******************************************************/

%ходить(Ход,Позиция,Позиция!) -

%   Позиция1 - результатвыполненияходаХод

%   втекущейпозицииПозиция.

холить(ход(К,М),[N|Ns],[N|Nsl]):-

К>1,К1=К-1,ходить(ход<К1,М),Ns,Nsl). ходить(ход(1,М),[N|Ns],[Nl|Ns]):-

N>M,N1=N-M.

ходить(ход(1,Ы),[H|Ns].No).

/******it************************************************/

%           Переходходакдругомуигроку

/******♦*** ++ *********«*** + ***-v** I*********-**************/

другой_игрок(компьютер,противник) дру1Ч>й_игро1с(противник,компьютер) .

I **♦****************** + **♦* ***,»**** ****** ****************/

%              Об-ьявлекиерезультатаизтры

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

объявить(компьютер):-write("Выпобедили! Поздравляю."),nl. объявить(противник):-write("Япобедил!"),nl.

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

%                   Оценкапозиции

/а*******************************************************/

/♦*************♦***■********************************* **** */

%опэ.сная (Позиция, Сумма) -

%   Позициясним-суммойСуммаявляетсяопасной,

%   еслиним-сумманеравнанулю.

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

опасная(К«,Сумма):-

ним_сумма(Ns,С],Сумма),not(нуль(Сумма)). безопасная(Ns):-

not (опасная(Ns,_)) .


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

%                     Подсчет ним-суммы у***********************************************»********/

у********************************** ********♦*************/

%ним_сумма(Позиция,НакопленнаяСумма,Сумма) %   Сумма - ним-сумма текущей позиции Позиция,

%   НакопленнаяСумма - накопленное значение суммы.

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

ним_сумма([N|Ns],Bs,Сумма):двоичное(N,Ds),ким_сложение(Ds,Bs,Bsl), ним_сумма(Ns,Bsl,Сумма). ним_сумма([],Сумма,Сумма). ним_сложение(Bs,[],Bs). ним_сложение([),Bs,Bs). ним_сложение([В|Вз] , [С ICs] , [D|Ds]) :D=(B+C) mod 2,нии_сложение(Вз,Сз,0з). двоичное(1,[1]). двоичное(Ы,[D|Ds]):N>l,D=ll mod 2,N1=N div 2, двоичное(N1,Ds). десятичное(Ds,N):-дес(Ds,0,1,N). дес([],N,T,N). flec([D|Ds],A,T,N):A1=A+D*T,T1=T*2,дес(Ds,Al,Tl,N). нуль([]).

нуль([0|Zs]):-нуль(Zs). /***л****************************************************/

%                     Ход компьютера у******************** ************************************/

I ********4*******V** ****************** *******************/

%безопасный ход(Иььицмя,ИимСукма,Ход) %   Ход - ход в текущей позиции Позиция, которой соответствует

%   значение НимСумма, сохраняющий позицию безопасной.

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

безопасный_ход(Кучки,НимСумма,Ход):безоп_ход(Кучки,НимСумма,1,Ход). безоп_ход([Кучка|Кучки],НимСумма,К,ход(К,М)):двоичное(Кучка,Bs),может_быть_нуль(Bs,НимСумма,Ds,0), десятичное(Ds,M). безоп_ход([Кучка|Кучки],НимСумма,К,Ход):-

К1=К+1,беэоп_ход(Кучки,НимСумма,К1,Ход). может_быть_нуль([],НимСумма,[],0):-нуль(НимСумма). может_быть_нуль([В IBs] , [0 iНимСумма] , [C|Ds],C) :может_быть_нуль(Bs,НимСумма,Ds,С). может_быть_нуль([В|Bs],[1|НииСумма],[D|Ds],С):П=1-В*С,С1=1-В,может_быть__нуль(Bs,НимСумма,Ds,CD .

/а*******************Конец программы*************♦*******/