Заготовки простых экспертных систем
Экспертная система "Животные"
Первый вариант ЭС
Вариант диалога:
Решение проблемы
Новый вариант диалога:
То же самое, но на Питоне!
279.50K

Заготовки простых экспертных систем

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
English     Русский Правила