Похожие презентации:
Заготовки простых экспертных систем
1. Заготовки простых экспертных систем
2. Экспертная система "Животные"
Экспертная система "Животные"База правил включает обширный предикат
animal:
animal("пингвин") :- positive("плавает"),positive("имеет
окраску"), negative("приручено человеком"),negative("умеет
летать"),is("птица").
Как видите, внутри animal вызываются предикаты positive,
negative, is
3.
В свою очередь, negative и positive имеютвид:
positive(X) :- ask(X,R),R=="Y".
negative(X) :- ask(X,R),R=="N".
4.
Предикат ask:ask(X,R) :- string_concat(X," ? ",T),
write(T),
read_line_to_string(user_input,R).
Приклеиваем "?" к тексту вопроса, выводим вопрос и читаем
ответ.
Если ответ отличен от "Y" и "N", необходимо повторить запрос.
5.
Предикат is:is("птица"):- positive("откладывает яйца"),!;
positive("имеет оперение").
6. Первый вариант ЭС
animal("пингвин"):- positive("плавает"),positive("имеет окраску"),negative("приручено человеком"),negative("умеет летать"),
is("птица").
animal("гусь"):- positive("плавает"),positive("имеет окраску"),
positive("приручено человеком"),positive("умеет летать"),
is("птица").
is("птица"):- positive("откладывает яйца"),!;positive("имеет оперение").
positive(X):- ask(X,R),R=="Y".
negative(X):- ask(X,R),R=="N".
ask(X,R):- string_concat(X," ? ",T),write(T),read_line_to_string(user_input,R).
7. Вариант диалога:
8.
Все хорошо?Не совсем... Рассмотрим диалог для X=Гусь:
Три вопроса заданы
повторно. Почему?
9.
animal("пингвин"):- positive("плавает"),positive("имеет окраску"),negative("приручено человеком"),negative("умеет летать"),
is("птица").
animal("гусь"):- positive("плавает"),positive("имеет окраску"),
positive("приручено человеком"),positive("умеет летать"),
is("птица").
Обработка начинается с правила "пингвин". В точке,
выделенной красным, правило отвергается.
Происходит переход к правилу "гусь",
а там - те же вопросы... Довольно обидно!
10. Решение проблемы
Динамическая база данных (знаний) возможность во время выполненияпрограммы добавлять и удалять правила и
факты.
11.
:- dynamic yes/1.:- dynamic no/1.
Декларация
animal("пингвин"):- positive("плавает"),positive("имеет окраску"),
negative("приручено человеком"),negative("умеет летать"),
is("птица").
animal("гусь"):- positive("плавает"),positive("имеет окраску"),
positive("приручено человеком"),positive("умеет летать"),
is("птица").
animal("Пришелец с далекой планеты").
is("птица") :- positive("откладывает яйца"),!;positive("имеет оперение").
is("хищник"):- positive("живородящее"),!;
negative("поедает траву и кустарники"),positive("поедает других животных").
is("парнокопытное") :- positive("имеет копыта").
Проверка перед запросом
positive(X) :- yes(X),!; ask(X,R),R=="Y".
negative(X) :- no(X),!; ask(X,R), R=="N".
ask(X,R):- string_concat(X," ? ",T), write(T), read_line_to_string(user_input,R), remember(X,R).
remember(X,"Y"):- asserta(yes(X)).
remember(X,"N"):- asserta(no(X)).
Формируем факт
Запоминаем
ответ
12. Новый вариант диалога:
13.
Для удаления фактов из динамической базыслужать предикаты retract и retractall
14. То же самое, но на Питоне!
15.
d1= {"плавает":1,"имеет окраску":1,
"приручено человеком":0,
"умеет летать":0,
"?птица":1}
d2={"плавает":1,
"имеет окраску":1,
"приручено человеком":1,
"умеет летать":1,
"?птица":1}
d3={"откладывает яйца":1,
"имеет оперение":1}
data_base={"пингвин":d1,"гусь":d2,"?птица":d3}
16.
def animals(data_base):# Проходим базу знаний строка за строкой
dda={ }
for n,d in data_base.items():
# d - характеристики очередного животного
if n[0] != "?":
if check(d,dda,data_base):
print("Это - ",n)
break
else:
print("Я не знаю, кто это")
17.
def check(d,dda,data_base):for ask,ans in d.items():
if ask[0]=="?":
if check(data_base[ask],dda,data_base) and ans==1:
continue
else:
if ans==0:
continue
else:
return False
if dda.get(ask) is None:
rep=input(ask+"? ")
dda[ask]=int(rep)
rep=dda[ask]
if int(rep)!=ans:
return False
return True