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


число = integer

список = integer* predicates

решение (список)

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

не_бьет(число, число, список)

шаблон (список) clauses

решение ([]).

решение ([Х,У|Остальные])>

% Первый ферзь на поле X/Y,

% Остальные ферзи на полях из списка Остальные

решение (Остальные), принадлежит (Y,[1,2,3,4,5,6,7,8]), не_бьет (X,Y, Остальные).

% Первый ферзь не бьет остальных

не_бьет (_,_,[]). % Некого бить не_бьет (X, Y,[X1, Y1 |Остальные])> Y<>Y1,              % Разные Y-координаты

Y1-Y<>X1-X,   % Разные диагонали Y1-Y<>X-X1, не_бьет (X,Y, Остальные). Принадлежит (X,[X|J) Принадлежит (X,[_|L])> принадлежит (X,L).

/.ШЩ.ЩШиЩ1Ш1ШШ.Щ).ищи|ШИ>ШШ...»Ш,/

% Шаблон решения

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

шаблон (f 1 ,_,2,_,3,_,4,_,5,_,6,_,7,_,8,J).

goal шаблон (Позиция),решение (Позиция).

/**.***.****♦******«*,**♦*.***♦.*„*********„**.**,**„♦**„****,

/*—Конец программы «Задача о 8 ферзях»------------ */

7.2. Задачииупражнения

Написать программу для решения задачи о N ферзях.


8. ИГРОВЫЕ ПРОГРАММЫ

8.1. "Ханойскиебашни"

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

%                   "Ханойские башни"

/******** + **+************** + **** + **** + ** + ****•******** + ** I

I*Целевой предикат:

ханой(Число)                        */

/А*******************************************************/ /********♦**♦***♦**♦************♦******♦********♦****+***/ %       Переместить N дисков со стержня А на стержень С, %   используя стержень В как вспомогательный. При этом За %   один ход можно переместить только один диск и нельзя %              класть больший диск на меньший.

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

DOMAINS

спис_строк=строка* число=л.пЪедег строка=з tring

PREDICATES

ханой(число)

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

добав(спис_строк,спис_строк,спис_отрок)

вывод(спис_строк)

clauses ханой(N):makewindow(2,2,2,"Ханойские Башни",1,1,23,78), makewindow(2,2,2,"",3,3,18,74), хан(N,1,А,В,С,Moves),вывод(Moves), readchar(_).

хан(N,N2,А,В,С,Moves):-N>1,N1=K-1,N3=N2+1, xaH(Nl,N3,A,C,B,Msl), xaH(Nl,N3,B,A,C,Ms2), добав(Msl,[A," to ",C|Ms2],Moves).

хан(1,Ы2,А,В,С, [A, "   to '', C] ) :-A="A" ,B="B" ,C="C" ,

N2 mod 2=1.

xaH(l,N2,A,B,C,[A,"  to ",C]):-A="A",B="C",C="B".

хан(1,Ы2,А,В,С,[A,"  to ",C]):-A="B",B="A",C="C".

хан(1,Ы2,А,В,С,[A,"  to ",C]):-A="B",B="C",C="A".

хан(1,Ы2,А,В,С,[A,"  to ",C]):-A="C",B="A",C="B".

хан(1,Ы2,А,В,С,[A,"  to ",C]):-A="C",B="B",C="A".


добав([],Y,Y).

добав([Х|Ы] ,L2, [X|L3]) :-добав (LI ,1,2 ,L3)

вывод([]):-!,nl. вывод([Х1,Х2,ХЗ|У]):-

write(XI,X2,X3),write("\t"),

вывод(Y).

8.2. "Выдающийсяум"

%                  "Выдающийся ум"

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

% Программа являетсяреализацией игры "Быкиикоровы".

% Отгадывается четырехзначноечисло.

Особенности: предполагается, чтовводятсятолько

%              допустимыезначения.

Ограничения: всецифры числадолжныбытьразличны,

%              допускаютсятолькоконструкциивидаabed.

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

DOMAINS число= integer

код=число*

sarrpoc=3arrpoc (код, число, число)

database - выд_ум запрос(код,число,число) бд_счетчик(число)

PREDICATES видающийся_ум(код) чистка

предположение(код) проверка(код) сообщение

противоречивое(код) выв числа(код) вопрос(код)

соответствуют_быки_и_коровы(код,код,число,число) точное совпадение(код,код,число) точн_совпадение(код,код,число,число) общие_члены(код,код,число) общ_члены(код,код,число,число) допустимо(число,число) отменить(запрос)