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

счетчик(число)

сум(код,число)

пауза принадлежит(число,код)

выбор(код,код)

иьЗорЗ(число,ход,код)

CLAUSES

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

/*               Код основного механизма                */

/********** -(г*********************************************/

выдажяцийся_ум (Код) : makewindow(2,14,10,"****   Быки и коровы   *♦**"г 1,1,23,78),

makewindow(2,14,10,"",6,15,10,50), чистка,                 %1

предположение(Код),     %2

проверка(Код),          %3

сообщение,              %4

пауза. /***********♦********************************♦***********/

%   1. Чистка - очистка внутренней базы данных программы

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

чистка:-отменить(запрос(Предположение,Быки,Коровы)). отменить(_):-retractall(запрос(_,_,_))■

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

%   2. Предположение(Код) - генерация числа-предположения

i it******************************************************/

предположение(Код):Код=[Х1,Х2,ХЗ,Х4],выбор(Код,[1,2,3,4,5,6,7,8,9,0]).

/********* + *******Определение подмножества***************/

%   2.1 выбор(X,XI) %      список X является подмножеством списка XI

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

выбор([X|Xs],Ys):-выборЗ(X,Ys,Ysl),выбор<Xs,Ysl). выбор([],Ys) .

/*****************Выделение элемента из списка***********/ %      2.2 выборЗ(Х,Х1,Х2)   -

%             список Х2 получен в результате удаления одного

%             вхождения элемента X из списка XI

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

выборЗ(Х,[Х|Х1],Х1).

выборЗ(Х, [Y|Y1], [Y|Z1]) :-выборЗ(Х,Х1,г1) .


/it*******************************************************/ %      3.  Проверка предложенного предположения

/************************ 4- ************* а*****************/

проверка(Предположение):not(противоречивое(Предположение)),вопрос(Предположение).

/б*******************************************************/ %      3.1.  Новое предположение противоречиво,  если в нем %                количество быков и коров не соответсвует старому

/♦A**************************а************************-**i/

противоречивое(Предположение) :запрос(СтароеПредположение,Быки,Коровы), not(соответствутот_быки_и_коровы(СтароеПредположение,

Предположение,Быки,Коровы)).

соответствуж1т_быки_и_коровы (СтароеПредположение,

Предположение,Быки,Коровы):точнов_совпадвние(СтароеПредположение,Предположение,N1), EiixH=Nl,                            «Правильнее число быков общие_члены(СтароеПредположение,Предположение,N2), Koposw=N2-Быки.                   ^правильноечисло коров точное_совпаденив(Xs,Ys,N):-точн_совпгдвние(Xs,Ye,0,N). точн_совпадекие([Х|Хв],[Х|Ys],K,N):К1=К+1,! , точн_совпаденив(Xs,Ys,Kl,N) . точн_совпадение([Х|Ха],[Y|Y»],K,N):XOI, ! , фочк совпадение (Xs,Ys,К,Н) . точн_совпадение([],[],N,N).

общие члены (Xs , Ys ,. N) : -общ, члены (Xs , 1 а , 0 , Ы) . общ_члены([Х|Х8],Ys,K,N)

принадлежит(X,Ys),К1=К+1,>,общ_«лены(Xs,Ys,Kl, N) . общ_члены([Х|Хз],Ys,K,N):-!, общ_члеиы(Xs,Ys,К,N). общ_члены([],Ys,N,N).

/*******<-*****Определение принадлежности списку**********/

%   3.1.1. принадлежит(X,Y) %         элемент X принадлежит списку Y

/t*******************************************************/

принадлежит(X,[X|Y]).

.принадлежит(X,[X1|Y]):-принадлежит(X,Y).

/********************************•***♦********************/

%   3.2. вопрос(Предположение) %        вопрос относительно истинности числа-предположения