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

Содержание

Слайд 2

Экспертная система "Животные" База правил включает обширный предикат animal: animal("пингвин") :-

Экспертная система "Животные"

База правил включает обширный предикат 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".

В свою очередь, 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). Приклеиваем "?"

Предикат ask:
ask(X,R) :- string_concat(X," ? ",T),
write(T),
read_line_to_string(user_input,R).
Приклеиваем "?" к тексту

вопроса, выводим вопрос и читаем ответ.
Если ответ отличен от "Y" и "N", необходимо повторить запрос.
Слайд 5

Предикат is: is("птица"):- positive("откладывает яйца"),!; positive("имеет оперение").

Предикат is:
is("птица"):- positive("откладывает яйца"),!;
positive("имеет оперение").

Слайд 6

Первый вариант ЭС animal("пингвин"):- positive("плавает"),positive("имеет окраску"), negative("приручено человеком"),negative("умеет летать"), is("птица"). animal("гусь"):-

Первый вариант ЭС

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=Гусь: Три вопроса заданы повторно. Почему?

Все хорошо?
Не совсем... Рассмотрим диалог для X=Гусь:

Три вопроса заданы повторно.

Почему?
Слайд 9

animal("пингвин"):- positive("плавает"),positive("имеет окраску"), negative("приручено человеком"),negative("умеет летать"), is("птица"). animal("гусь"):- positive("плавает"),positive("имеет окраску"), positive("приручено

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("умеет

:- 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

Для удаления фактов из динамической базы служать предикаты retract и retractall

Слайд 14

То же самое, но на Питоне!

То же самое, но на Питоне!

Слайд 15

d1= {"плавает":1, "имеет окраску":1, "приручено человеком":0, "умеет летать":0, "?птица":1} d2={"плавает":1, "имеет

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={ }

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("Я не знаю, кто это")