DOMAINS i=integer s=string c=char li=i* /* список целых чисел */ DATABASE — knowledge cond(i,s) /* свойства животных */ rule(s,li) /* описания животных */ DATABASE — dialog cond_is(i,c) /* номер условия; '1' — имеет место, '2' — не имеет места у загаданного животного */ PREDICATES start animals /* отгадывает животное */ check(li) /* добавляет в базу информацию о новом животном */ test_cond(i) /* проверяет, обладает ли загаданное животное свойством с данным номером */ update /* добавляет в базу информацию о новом животном */ add_cond(li) /* возвращает список, состоящий из номеров свойств, имеющихся у нового животного */ print_cond(i,li,li) /* добавляет в список номера свойств, относительно которых уже были даны утвердительные ответы */ read_cond(c,li,li) /* добавляет в список номера свойств, о которых еще не спрашивалось */ ex_cond(i,li,li,i) /* добавляет в список номера имеющихся в базе свойств, которыми обладает новое животное */ wr_cond(c,i,li,li) new_cond(i,li,li) /* добавляет в список номера новых свойств, которыми обладает новое животное, а также добавляет описания новых свойств в базу знаний */ read_true_char(c) /* с помощью предиката test читает символ с клавиатуры, пока он не окажется равен '1' или '2'*/ test(c,c) /* добивается, чтобы пользователь нажал один из символов, '1' или '2' */ CLAUSES start:– consult("animals.ddb",knowledge), /* загружаем в базу информацию из базы знаний */ write("Загадайте животное, а я попытаюсь его отгадать"),nl, animals, /* попытка отгадать загаданное животное */ retractall(_,dialog), /* очищаем текущую информацию */ retractall(_,knowledge), /* очищаем информацию об известных животных и свойствах */ nl,nl,write("Хотите еще раз сыграть? (1 — Да, 2 — Нет)"), read_true_char(C), C='1',!,start. start:– nl,nl,write("Всего доброго! До новых встреч"), readchar(_). animals:– rule(X,L), check(L), nl,write("Я думаю, это ",X), nl,write("Я прав? (1 — да, 2 — нет)"), read_true_char(C),C='1',!. animals:– nl,write("Я не знаю, что это за животное"),nl, nl,write("Давайте добавим его в мою базу знаний."),nl, update. update:– nl,write("Введите название животного:"), readln(S), add_cond(L), /* указываем свойства животного */ assert(rule(S,L),knowledge), /* добавляем информацию в базу знаний*/ save("animals.ddb",knowledge) /* сохраняем базу знаний в файл */. add_cond(L):– cond_is(_,'1'),!, /* имеется информация о свойствах животного */ nl,write("О нем известно, что оно: "), print_cond(1,[],L1), /* вывод имеющейся о животном информации */ nl,write("Известно ли о нем еще что-нибудь? (1 — да, 2 — нет)"), read_true_char(C), read_cond(C,L1,L). add_cond(L):– read_cond('1',[],L). print_cond(H,L,L):– not(cond(H,_)),!. print_cond(H,L,L1):– cond_is(H,'1'),!, cond(H,T), H1=H+1, nl,write(T), print_cond(H1,[H L],L1). print_cond(H,L,L1):– H1=H+1, print_cond(H1,L,L1). read_cond('1',L,L2):– ex_cond(1,L,L1,N), new_cond(N,L1,L2),!. read_cond(_,L,L):–!. ex_cond(N,L,L,N):– not(cond(N,_)),!. ex_cond(N,L,L1,N2):– cond_is(N,_),!, N1=N+1, ex_cond(N1,L,L1,N2). ex_cond(N,L,L1,N2):– cond(N,S), nl,write("Оно ",S,"? (1 — да, 2 — нет)"), read_true_char(A), wr_cond(A,N,L,L2), N1=N+1, ex_cond(N1,L2,L1,N2). wr_cond('1',N,L,[N L]):–!. wr_cond('2',_,L,L):–!. new_cond(N,L,L1):– nl,write("Есть еще свойства? (1 — да, 2– нет)"), read_true_char(A), A='1',!, nl,write("Укажите новое свойство, которым обладает животное"), nl,write("в виде 'оно <описание нового свойства>'"), readln(S), assertz(cond(N,S)), /* добавление нового свойства в базу знаний */ N1=N+1, new_cond(N1,[N L],L1). new_cond(_,L,L). check([HT]):– test_cond(H), check(T). check([]). test_cond(H):- cond_is(H,'1'),!. /* в базе имеется информация о наличии свойства */ test_cond(H):– cond_is(H,'2'),!, fail. /* в базе имеется информация об отсутствии свойства */ test_cond(H):– /* в базе нет никакой информации о данном свойстве, получаем ее у человека */ cond(H,S), nl,write("Оно ",S,"? (1 — да, 2 — нет)"), read_true_char(A), assert(cond_is(H,A)), test_cond(H). read_true_char(C):– readchar(C1), test(C1,C). test(C,C):– '1'<=C,C<='2',!. test(_,C):– write("Нажмите 1 или 2!"),nl, readchar(C1), test(C1,C). GOAL start