Динамические базы данных. Искусственный интеллект
Динамические базы данных
Описание предпкатов базы данных
Добавление и удаление фактов, сохранение, загрузка БД
Удаление всех фактов
Телефонный справочник Постановка задачи
Телефонный справочник Начало программы
Телефонный справочник
Меню
Выход из программы
Получение телефонного номера по фамилии
Получение телефонного номера по фамилии
Получение фамилии по телефонному номеру
Получение фамилии по телефонному номеру
Добавление факта в БД
Обновление факта в БД
Удаление факта из БД
Вычисление чисел Фиббоначи
Быстрый поиск числа Фиббоначи
Использование динамической БД для вычисления чисел Фиббоначи
Искусственный интеллект
«Элиза»
Обработка введенной строки
Реализация предиката lower_rus
Реализация предиката first_word
Реализация предиката del_sep
Реализация предиката str_w_list
Подбор шаблона, которому соответствует введенная строка
Подбор шаблона, которому соответствует введенная строка
Подбор шаблона, которому соответствует введенная строка
«Элиза»
«Элиза»
«Элиза»
«Элиза»
«Элиза»
Аналоги и различные реализации «Элизы»
Экспертная система «Самообучающийся определитель животных»
Базовый набор свойств
Описание животных
Хранение ответов
Отгадывание животного
Проверка свойств, входящий в список
Наличие у животного некоторого свойства
Проверка нажатой клавиши
Добавление нового животного в базу
Вывод имеющихся свойств нового животного и добавление новых свойств
Добавление в базу номеров и описаний новых свойств
Экспертная система
Экспертная система
Экспертная система
Экспертная система
Экспертная система
Экспертная система
Задания для самостоятельного решения
625.00K

lecture08

1. Динамические базы данных. Искусственный интеллект

Лекция № 8

2. Динамические базы данных

Работа с внутренними (динамическими) базами
данных: добавление фактов в базу, удаление
фактов из базы
Проекты «Телефонный справочник», «Словарь»

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. Телефонный справочник Начало программы

DOMAINS
name, 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. «Элиза»

CONSTANTS
separators=[' ', ',', '.', ';']
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. «Элиза»

CLAUSES
eliz:–
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. Экспертная система

DOMAINS
i=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. Экспертная система

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(_).

50. Экспертная система

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(_).

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. Добавить в экспертную систему по
отгадыванию животных механизм
объяснения решения программой
English     Русский Rules