Similar presentations:
lecture08
1. Динамические базы данных. Искусственный интеллект
Лекция № 82. Динамические базы данных
Работа с внутренними (динамическими) базамиданных: добавление фактов в базу, удаление
фактов из базы
Проекты «Телефонный справочник», «Словарь»
3. Описание предпкатов базы данных
DATABASE [ — <имя базы данных>]<имя предиката> (<имя домена первого аргумента>,
..., < имя домена n-го аргумента>)
Например:
DOMAINS
student_name, teacher_name = string
DATABASE – supervision
supervisor(student_name, teacher_name)
4. Добавление и удаление фактов, сохранение, загрузка БД
assert (факт[, имя_бд])asserta (факт[, имя_бд])
assertz (факт[, имя_бд])
retract (факт[, имя_бд])
retractall (_[, имя_бд])
save (имя_файла[, имя_бд])
consult (имя_файла[, имя_бд])
5. Удаление всех фактов
retractall2(Fact):–retract(Fact),
fail.
retractall2(_).
6. Телефонный справочник Постановка задачи
1. Программа должна выводить меню функций2. Программа должна искать и выводить (если есть) номер
телефона по введенной фамилии
3. Программа должна искать и выводить (если есть)
фамилию абонента по введенному номеру
4. Программа должна позволять вводить новые записи в
справочник
5. Программа должна позволять изменять номер телефона у
введенного пользователем абонента
6. Программа должна позволять удалять запись по
введенной фамилии
7. Программа должна завершать работу при нажатии
клавиши ‘0’
7. Телефонный справочник Начало программы
DOMAINSname, number = String
file=f
DATABASE
phone(name, number)
PREDICATES
name_phone(name, number)
phone_name(name, number)
m(char)
menu
start
8. Телефонный справочник
start:–проверить наличие файла,
загрузить файл в ОП (если он есть),
показать меню.
start:–
открыть файл за запись (если его не было),
закрыть файл,
показать меню.
9. Меню
menu:–вывести меню,
считать символ,
проверить символ.
10. Выход из программы
Если символ – ‘0’, то:m('0'):– сохранить БД,
очистить память.
Если символ любой, кроме ‘1’, ‘2’, ‘3’, ‘4’,
‘5’, ‘0’, то:
m(_):–
menu.
11. Получение телефонного номера по фамилии
m('1'):–ввести фамилию,
вывести номер телефона,
вывести меню.
12. Получение телефонного номера по фамилии
name_phone(Name,Phone):–phone(Name,Phone),!.
name_phone(_,”Нет информации о
таком человеке").
13. Получение фамилии по телефонному номеру
m('2'):–ввести номер телефона,
вывести фамилию,
вывести меню.
14. Получение фамилии по телефонному номеру
phone_name(Name,Phone):–phone(Name,Phone).
phone_name("Нет информации о номере",_).
15. Добавление факта в БД
m('3'):–ввести фамилию,
ввести номер телефона,
добавить в справочник новую запись,
вывести меню.
16. Обновление факта в БД
m('4'):–ввести фамилию,
ввести новый номер телефона,
удалить запись со старым номером телефона,
добавить запись с новым номером телефона,
вывести меню.
17. Удаление факта из БД
m('5'):–ввести номер телефона,
удалить запись с указанным номером телефона,
вывести меню.
18. Вычисление чисел Фиббоначи
fib(0,1):–!.fib(1,1):–!.
fib(N,F) :–
N1=N–1, fib(N1,F1),
N2=N–2, fib(N2,F2),
F=F1+F2.
19. Быстрый поиск числа Фиббоначи
fib_fast(0,1,1):–!.fib_fast(N,FN,FN1):–
N1=N–1,fib_fast(N1,FN_1,FN),
FN1=FN+FN_1.
20. Использование динамической БД для вычисления чисел Фиббоначи
fib2(0,1):–!.fib2(1,1):–!.
fib2(N,F):–
fib_db(N,F),!.
fib2(N,F) :–
N1=N–1, fib2(N1,F1),
N2=N–2, fib2(N2,F2),
F=F1+F2,
asserta(fib_db(N,F)).
21. Искусственный интеллект
Имитация разговора доктора и пациентаЭкспертная система «Самообучающийся
определитель животных»
22. «Элиза»
1. Приглашение к описанию проблемы2. Чтение строки
3. Подбор шаблона, который соответствует
введенной строке
4. Выдать соответствующий ответ или попросить
продолжить рассказ
5. Возврат к п.2
23. Обработка введенной строки
1. Преобразовать прописные буквы в срочныеlower_rus(char,char)
2. Выделение первого слова
first_word(string,string,string)
3. Удаление разделителей из начала строки
del_sep(string,string)
4. Преобразование строки в список слов
str_w_list(string,string*)
24. Реализация предиката lower_rus
lower_rus(C,C1):–'А'<=C,C<='П',!,
char_int(C,I),
I1=I+(160–128),
char_int(C1,I1).
lower_rus(C,C1):–
'Р'<=C,C<='Я',!,
char_int(C,I),
I1=I+(224–144),
char_int(C1,I1).
lower_rus(C,C).
25. Реализация предиката first_word
first_word("", "", ""):–!.first_word(S,W,R):–
frontchar(S,C,R1),
not(member(C,separators)),!,
first_word(R1,S1,R),
lower_rus(C,C1),
frontchar(W,C1,S1).
first_word(S,”",R):–frontchar(S,_,R).
26. Реализация предиката del_sep
del_sep("",""):–!.del_sep(S,S1):–
frontchar(S,C,R),
member(C,separators),!,
del_sep(R,S1).
del_sep(S,S) .
27. Реализация предиката str_w_list
str_w_list("",[]):–!.str_w_list(S,[H T]):–
first_word(S,H,R),!,
str_w_list(R,T).
28. Подбор шаблона, которому соответствует введенная строка
1. Человек хочет закончить работу с программой. Об этойситуации свидетельствует наличие в списке таких слов,
как «пока», «свидания» (часть словосочетания «до
свидания»). В ответ программа также прощается и
выражает надежду, что она смогла чем-нибудь помочь.
2. Человек испытывает какое-то чувство (наличие в списке
слов «испытываю», «чувствую»). Программа реагирует
вопросом о том, как давно человек испытывает это
чувство.
3. Если во вводимой строке встретились слова «любовь»
или «чувства», то программа поинтересуется, не боится
ли человек эмоций.
29. Подбор шаблона, которому соответствует введенная строка
4. При обнаружении слова «секс» во входном списке словбудет выдано сообщение о важности сообщения.
5. В случае наличия слов «бешенство», «гнев» или
«ярость», программа уточнит, что человек испытывает в
данный момент времени.
6. В ответ на краткий ответ («да» или «нет») будет выдана
просьба рассказать подробнее.
7. Если в списке слов найдутся слова «комплекс» или
«фиксация», программа отреагирует замечанием о том,
что человек слишком много «играет».
8. Появление слова «всегда» в строке, введенной человеком,
приводит к ответной реакции — вопросу о том, может ли
человек привести какой-нибудь пример.
30. Подбор шаблона, которому соответствует введенная строка
9. В случае, если человек упомянул кого-то из своих родных(«папа», «мама», «жена», «муж», «брат», «сестра», «сын»,
«дочь» и т.д.), программа попросит рассказать
поподробнее о его семье. При этом упомянутый
родственник будет помещен в базу данных, чтобы потом
продолжить этот разговор.
10. Если в процессе разговора была сделана запись во
внутреннюю базу данных и в данный момент спросить
больше не о чем, программа «вспомнит» об упомянутом
родственнике и выдаст фразу: «Ранее Вы упоминали ...»
11. И, наконец, если введенная строка не подходит ни под
один шаблон, программа просит продолжить рассказ.
31. «Элиза»
CONSTANTSseparators=[' ', ',', '.', ';']
DOMAINS
i=integer
s=string
ls=s*
lc=char*
DATABASE
Important(s)
PREDICATES
member(s,ls)
member(char,lc)
lower_rus(char,char)
del_sep(s,s)
first_word(s,s,s)
str_w_list(s,ls)
read_words(ls)
recognize(ls,i)
answ(ls)
eliz
repeat
32. «Элиза»
CLAUSESeliz:–
repeat,
read_words(L),
recognize(L,I),
answ(I),nl,
I=0
read_words(L):–
readln(S),
str_w_list(S,L).
33. «Элиза»
recognize(L,0):–member("пока",L),!;
member("свидания",L),!.
recognize(L,1):–
member("испытываю",L),!.
recognize(L,2):–
member("любовь",L),!;
member("чувства",L),!.
recognize(L,3):–
member("секс",L),!.
recognize(L,4):–
member("бешенство",L),!;
member("гнев",L),!;
member("ярость",L),!.
recognize(L,5):–
L=["да"],!;
L=["нет"],!.
recognize(L,6):–
member("комплекс",L),!;
member("фиксация",L),!.
recognize(L,7):–
member("всегда",L),!.
recognize(L,8):–
member("мать",L), assert(important("своей
матери")),!;
member("мама",L), assert(important("своей
маме")),!;
member("отец",L), assert(important("своем
отце")),!;
member("папа",L), assert(important("своем
папе")),!;
member("муж",L), assert(important("своем
муже")),!;
member("жена",L), assert(important("своей
жене")),!;
...
recognize(_,9):–
important(_),!.
recognize(_,10).
34. «Элиза»
answ(0):–write("До свидания"),nl,
write("Надеюсь наше общение помогло Вам").
answ(1):–write("Как давно Вы это испытываете?").
answ(2):–write("Вас пугают эмоции?").
answ(3):–write("Это представляется важным").
answ(4):–write("А что Вы испытываете сейчас?").
answ(5):–write("Расскажите об этом подробнее").
answ(6):–write("Слишком много игр").
answ(7):–write("Вы можете привести какой–нибудь пример?").
answ(8):–write("Расскажите мне подробнее о своей семье").
answ(9):–
important(X),!,
write("Ранее Вы упомянули о ",X),
retract(X).
answ(10):–
write("Продолжайте, пожалуйста").
35. «Элиза»
repeat.repeat:–
repeat.
member(X,[X|_]):–!.
member(X,[_|S]):–member(X,S).
lower_rus...
del_sep...
str_w_list...
first_word...
GOAL
write("Расскажите, в чем заключается Ваша проблема"),nl,
eliz,
readchar(_).
36. Аналоги и различные реализации «Элизы»
1.2.
3.
4.
К. Колби – имитация пациента-параноика
Г. Гарви – программная модель католического проповедника
Л. Стерлинг, Э. Шапиро. Искусство программирования на языке
Пролог.
Д. Марселлус. Программирование экспертных систем на ТурбоПрологе.
37. Экспертная система «Самообучающийся определитель животных»
1.2.
3.
4.
5.
Хранение базового набора свойств животных
Хранение описаний животных
Хранение ответов человека при отгадывании животного
Отгадывание животного
Добавление в базу информации о новом животном
38. Базовый набор свойств
cond(1,”кормит детенышей молоком").cond(2,”имеет перья").
cond(3,”плавает").
cond(4,”ест мясо").
cond(5,”имеет копыта").
cond(6,”летает").
cond(7,”откладывает яйца").
cond(8,”имеет шерсть").
cond(9,”имеет полосы").
cond(10,”имеет пятна").
cond(11,”имеет черно-белую окраску").
cond(12,”имеет длинную шею").
cond(13,”имеет длинные ноги").
cond(14,”имеет щупальца").
39. Описание животных
rule("гепард",[1,4,8,10]).rule("тигр",[1,4,8,9]).
rule("жираф",[1,5,8,10,12,13]).
rule("зебра",[1,5,8,9,11]).
rule("страус",[2,14]).
rule("пингвин",[2,3,11]).
rule("орел",[2,6]).
rule("кит",[1,3,11]).
rule("осьминог",[3,14]).
40. Хранение ответов
cond_is(N,'1').cond_is(N,'2').
41. Отгадывание животного
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.
42. Проверка свойств, входящий в список
check([H|T]):–test_cond(H),
check(T).
check([]).
43. Наличие у животного некоторого свойства
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).
44. Проверка нажатой клавиши
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).
45. Добавление нового животного в базу
update:–nl,write("Введите название животного:"),
readln(S),
add_cond(L),
assert(rule(S,L),knowledge),
save("animals.ddb",knowledge).
46. Вывод имеющихся свойств нового животного и добавление новых свойств
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).
47. Добавление в базу номеров и описаний новых свойств
read_cond('1',L,L2):–ex_cond(1,L,L1,N),
new_cond(N,L1,L2),!.
read_cond(_,L,L):–!.
48. Экспертная система
DOMAINSi=integer
s=string
c=char
li=i*
DATABASE — knowledge
cond(i,s)
rule(s,li)
DATABASE — dialog
cond_is(i,c)
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(c,c)
49. Экспертная система
CLAUSESstart:–
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(_).
50. Экспертная система
CLAUSESstart:–
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(_).
51. Экспертная система
animals...update...
add_cond(L)...
read_cond…
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).
52. Экспертная система
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):–!.
53. Экспертная система
new_cond(N,L,L1):–nl,write("Есть еще свойства? (1 - да, 2 - нет)"),
read_true_char(A),
A='1',!,
nl,write("Укажите новое свойство, которым обладает
животное в виде 'оно <описание нового свойства>'"),
readln(S),
assertz(cond(N,S)),
N1=N+1,
new_cond(N1,[N/L],L1).
new_cond(_,L,L).
test_cond...
read_true_char...
test...
GOAL start
54. Задания для самостоятельного решения
1. Реализовать «Элизу» с учетом падежныхизменений слов
2. Добавить в экспертную систему по
отгадыванию животных механизм
объяснения решения программой