Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Оболочка IMP

.pdf
Скачиваний:
5
Добавлен:
27.03.2015
Размер:
361.17 Кб
Скачать

21

Ответ пользователя обрабатывается следующими тремя правилами:

how_explain(Reply):- Reply=’п’.

how_explain(Reply):- fronttoken(Reply,_,X1), fronttoken(X1,X2,Y), concat(X2,Y,X),

infer_summary(imp(_,_,X,_,_,_,_,_),_), clearwindow,

write(”Импликации, поддерживающие данное заключение:”),nl,nl,

infer_summary(imp(A,A1,X,R,S,C,D,E),F), write(”Выведено заключение: ”,X),nl, gettype(A,Z),

write(”из ”,Z),nl, getmode(R,RR),

write(”Посылка 1: ”,RR,”(”,S,”)”),nl, getmode(C,CC),

write(”Посылка 2: ”,CC,”(”,D,”)”),nl, write(”Из этой импликации КО равен: ”,F),nl, fail.

how_explain(Reply):- fronttoken(Reply,_,X1), fronttoken(X1,X2,Y), concat(X2,Y,X), terminal_node(X), evidence(X,C),

write(”Вы сообщили, что для условия:”),nl, write(X),nl,

write(”КО равен: ”,C),nl fail.

gettype(”a”,”импликация с посылкой типа И”). gettype(”o”,”импликация с посылкой типа ИЛИ”). getmode(”pos”,””).

getmode(”neg”,”NOT”). getmode(”dummy”,””).

Если пользователь удовлетворен результатом ЭС, то он вводит строку ’п’. Тогда успешно выполняется первое правило how_explain, и правило how_describer завершает работу.

Если пользователь вводит строку ’к имя_узла’, то выполняется второе или третье правило how_explain в зависимости от типа узла сети вывода (промежуточный или терминальный узел). Эти правила завершаются стандартным предикатом fail, вызывающим откат. Благодаря этому отыскиваются и обрабатываются все импликации, поддерживающие данный узел. После этого опять появляется запрос:

Введите ’к имя_узла’ [как] или ’п’ [продолжить].

22

2) Блок ответа на вопросы “почему”

Пользователю предоставляется возможность задавать вопросы “почему” только тогда, когда ЭС обрабатывает терминальные узлы сети вывода. Эти достигаются в результате многократного применения правила infer в процессе выполнения ОЦР. Для терминальных узлов КО определяются следующими двумя правилами:

infer(Node,Ct):– terminal_node(Node), evidence(Node,Ct),!.

infer(Node,Ct):– terminal_node(Node), repeat, nl,

write(”Введите ’п’ [почему] или значение КО ”), write(”от –1 до +1 для узла: ”),nl, write(Node),nl,

readln(Reply), reply_to_input(Node,Reply,Ct),!.

Если значение КО терминального узла уже имеется в БД, то используется первое правило infer, а иначе – второе. Во втором случае пользователь получает запрос:

Введите ’п’ [почему] или значение КО от –1 до +1 для узла: ...

Ответ пользователя обрабатывается следующими двумя правилами:

reply_to_input(Node,Reply,Ct):–

not(isname(Reply)), /* если введено значение КО */ adjuststack,

str_real(Reply,Ct), asserta(evidence(Node,Ct)),!.

reply_to_input(_,Reply,_):–

isname(Reply), /* если введено ’п’ */ Reply=”п”,nl,

dbimp(U,V,R,S,S1,X,Y,Y1), why_describer(U,V,R,S,S1,X,Y,Y1), retract(dbimp(U,V,R,S,S1,X,Y,Y1)), putadjustflag,

pauser,!,

fail.

Если пользователь вводит значение КО, то выполняется первое правило reply_to_input, которое преобразует строку в число и записывает это число в БД как факт evidence. При этом правило adjuststack инициализирует стек блока ответа на вопросы “почему”.

Если пользователь вводит строку ’п’, т. е. вопрос “почему”, то выполняется второе правило reply_to_input. При этом из стека считывается последняя запись и обрабатывается правилом why_describer, формирующим ответ на вопрос “почему”. Затем эта запись удаляется из стека, и тем самым содержимое стека подготавливается для формирования ответа на возможный следующий вопрос “почему”.

23

Кроме того, посредством правила putadjustflag устанавливается флаг, показывающий, что из стека извлекались записи и поэтому требуется восстановление его содержимого. Правило why_describer реализовано в двух формах:

why_describer(U,U1,V,R,S,X,Y,Z):- clearwindow,

U<>”s”,

gettype(U,UU),

write(”Пытаюсь использовать импликацию ”,UU),nl, write(”Она поддерживает заключение:”),nl, write(V),nl,

write(”Посылка 1:”),nl, write(S),nl, getmode1(R,RR),

write(”Эта посылка используется ”,RR),nl, write(”Посылка 2:”),nl,

write(Y),nl,

getmode1(X,XX),

write(”Эта посылка используется ”,XX),nl, write(”КО импликации равен: ”,Z),nl,!.

why_describer(”s”,V1,V,R,S,X,Y,Z):- clearwindow,

write(”Пытаюсь использовать импликацию ”), write(”с простой посылкой”),nl, write(”Она поддерживает заключение:”),nl, write(V),nl,

write(”Посылка:”),nl, write(S),nl, getmode1(R,RR),

write(”Эта посылка используется ”,RR),nl, write(”КО импликации равен: ”,Z),nl,!.

getmode1(”pos”,”без отрицания”). getmode1(”neg”,”с отрицанием”).

Если пользователь продолжает вводить вопросы “почему”, то с помощью записей из стека будут формироваться и выводиться все более общие объяснения. Когда запас объяснений будет исчерпан, пользователь больше не сможет задавать вопросы “почему” и введет значение КО терминального узла. Тогда ЭС продолжит свои рассуждения.

3. Реализация оболочки ЭС IMP

3.1. Компоновка блоков ЭС IMP

Рассмотренные выше блоки выполнения приближенных рассуждений (infer, allinfer, combine, supercombine) и объяснения (why_describer, how_describer) в совокупности со стандартной машиной логического вывода системы программирования Турбо-Пролог образуют механизм вывода ЭС IMP. Этот механизм вывода полностью отделен от базы знаний и не требует понимания его экспертом предметной области.

24

Эксперту достаточно уметь записывать знания в формате, подходящем для механизма вывода, а именно, в виде фактов языка Пролог на базе предикатов imp, terminal_node и hypothesis_node, причем выше было показано, что набор фактов типа imp отображает знания предметной области, предварительно представленные как набор продукционных правил или, иными словами, как набор импликаций с указанием коэффициентов определенности и признаков обратимости.

До сих пор мы рассматривали работу ЭС IMP на примерах абстрактных импликаций, таких как c e или c e1 e2. Однако на практике эксперты выражают свои знания конкретно и хотят представлять их в базе знаний в содержательной форме, например, так:

ЕСЛИ (пациент болен пневмонией) ТО (у него лихорадка).

Казалось бы такое желание эксперта легко удовлетворить, заменив абстрактные имена узлов сети вывода на соответствующие символьные строки. Однако при такой формальной замене часто возникают семантические проблемы. Например, набору абстрактных импликаций

c1

e

 

c2

e1 e2

(3.1)

может соответствовать набор конкретных импликаций, сформулированных экспертом в на естественном языке (ЕЯ) следующим образом:

ЕСЛИ (пациент болен пневмонией) ТО (он имеет лихорадку)

ЕСЛИ (у пациента лихорадка)

И

(он

в пожилом возрасте)

 

ТО

(за

ним надо ухаживать).

(3.2)

Очевидно, что в фактах языка Пролог на базе предикатов imp, описывающих импликации (3.1) нельзя чисто формально заменить абстрактные символы c, e, e1 и e2 на соответствующие фразы эксперта из (3.2), т.к. тогда знания эксперта будут записаны в базе знаний неправильно. Действительно, во-первых, в программной записи импликаций не будет учтено, что символьные строки “он имеет лихорадку” и “у пациента лихорадка” имеют одинаковый смысл, а во-вторых, дополнительную неточность внесет местоимение “он”, т.к. область действия импликации будет ограничена только лицами мужского пола. Следовательно, запись импликаций в виде фактов на базе предикатов imp с использованием фраз ЕЯ требует соблюдения следующих условий:

Фразы ЕЯ, имеющие одинаковый смысл, должны записываться во всех импликациях водной и той же форме.

Не использовать в фразах собственные имена и местоимения.

Поэтому, например, прежде, чем записывать импликации (3.2) в виде фактов языка Пролог на базе предикатов imp, надо переписать их в следующем виде:

ЕСЛИ (пациент имеет пневмонией) ТО (пациент имеет лихорадку)

ЕСЛИ (пациент имеет лихорадку)

И(пациент имеет пожилой возраст)

ТО (пациент нуждается в уходе).

(3.3)

25

3.2. Добавление формул в импликации

До сих пор предполагалось, что посылки импликаций – символьные строки. Однако на практике эксперты часто используют также импликации, где посылка является реляционным выражением над некоторыми переменными, например:

ЕСЛИ (стоимость_объекта > 0.28 * зарплата) ТО (клиент не может купить объект).

Такая посылка принимает значение “истина” или “ложь”. Значения переменных посылки могут вводиться пользователем или вычисляться.

Чтобы ЭС IMP могла использовать импликации с реляционными выражениями в посылке, она должна содержать блок, который вычисляет формулу такой посылки и присваивает затем посылке значение “истина” или “ложь”. Этим значениям сопоставляются КО, равные +1 и –1 соответственно.

4. Пример разработки экспертной системы в оболочке IMP

Рассмотрим создание ЭС для консультаций по инвестициям в среде оболочки IMP. База знаний разработана применительно к экономике США в предположении, что управление инвестициями не составляет труда, если вы обладаете начальным капиталом, намерены взять на себя долговременные обязательства и избегаете постоянного занятия торговлей. Принятие инвестиционных решений в ЭС основано на представлении, что в мире бизнеса есть два доминирующих цикла. Первый из них, т.н. деловой цикл, – последовательность подъемов и спадов деловой активности. Со времен второй мировой войны он уже повторялся 10 раз. Второй цикл – предсказуемые изменения процентных ставок, которые правительство США обычно предпринимает в соответствии с деловым циклом. Инвестиционная стратегия предполагает, что колебания конъюнктуры рынка почти всегда адекватно соответствуют точке траектории делового цикла, из-за чего трудно ответить на вопрос, в какой фазе цикла мы сейчас находимся.

Другой заложенный в ЭС принцип заключается в том, чтобы купить дешево, а продать дорого и попытаться поступать наоборот тогда, когда все остальные игроки достигли согласия в вопросе о том, какие стороны экономики надо развивать. Если это согласие достаточно устойчиво, то это самозащита. Идея игры основана на принципе противоречия. Когда каждый игрок кричит “куплю”, вы должны продавать.

С учетом вышесказанного была разработана ЭС с базой знаний в виде следующего набора импликаций:

imp("s","n","Предсказывается под'ем.","pos","Краткосрочные процентные ставки недавно возросли.","dummy","dummy",0.4). imp("a","r","Предсказывается под'ем.","pos","Цены возрастают уже несколько месяцев.","pos","Общественное мнение в основном положительно.",0.6).

imp("a","n","Предсказывается под'ем.","pos","Значение коэффициента IPI больше единицы.","pos","Значение коэффициента IPI падает уже три месяца.",0.4).

imp("s","r","Предсказывается кризис.","pos","Значение коэффициента

GNP уменьшается уже два квартала.","dummy","dummy",0.5). imp("a","r","Предсказывается кризис.","pos","Деловая активность снизилась.","pos","Общественное мнение в основном отрицательно.",0.6).

26

imp("s","n","Предсказывается фаза под'ема.","pos","Процентные ставки падают уже несколько месяцев.","dummy","dummy",0.7). imp("s","n","Предсказывается фаза под'ема.","pos","Уменьшение спроса на ссуду.","dummy","dummy",0.6). imp("s","n","Предсказывается фаза под'ема.","pos","Вероятно снижение процентных ставок.","dummy","dummy",0.6). imp("s","n","Предсказывается фаза под'ема.","pos","Это год перед выборами президента.","dummy","dummy",0.3). imp("s","n","Предсказывается фаза под'ема.","pos","Это год президентских выборов.","dummy","dummy",0.45). imp("s","n","Предсказывается фаза под'ема.","pos","Благоприятны краткосрочные вложения.","dummy","dummy",0.6). imp("a","n","Предсказывается фаза под'ема.","pos","Значение коэффициента IPI больше единицы.","pos","Значение коэффициента IPI возрастает.",0.6).

imp("s","n","Предсказывается фаза падения.","pos","Краткосрочные процентные ставки недавно возросли.","dummy","dummy",0.4). imp("s","n","Предсказывается фаза падения.","pos","Краткосрочные процентные ставки выше долгосрочных.","dummy","dummy",0.7). imp("s","n","Предсказывается фаза падения.","pos","Повышение спроса на ссуду.","dummy","dummy",0.4). imp("s","n","Предсказывается фаза падения.","pos","Неэффективность краткосрочных вложений.","dummy","dummy",0.6). imp("s","n","Предсказывается фаза падения.","pos","Вероятно повышение процентных ставок.","dummy","dummy",0.6). imp("a","n","Предсказывается фаза падения.","pos","Предсказывается под'ем.","pos","Стабилизация процентных ставок после колебаний.",0.4).

imp("f","n","Благоприятны краткосрочные вложения.","pos","Yearly_growth_in_M2-Yearly_growth_in_CPI > 4","dummy","dummy",0.5).

imp("f","n","Неэффективность краткосрочных вложений.","pos","Yearly_growth_in_CPI-Yearly_growth_in_M2 > 4","dummy","dummy",0.6).

imp("f","n","Вероятно снижение процентных ставок.","pos","Prime_rate-Short_term_CD_rate > 2.25","dummy","dummy",0.5). imp("f","n","Вероятно повышение процентных ставок.","pos","Prime_rate-Short_term_CD_rate < 1.75","dummy","dummy",0.6).

imp("s","n","Покупайте векселя.","pos","Предсказывается под'ем.","dummy","dummy",0.9).

imp("s","r","Покупайте ценные бумаги.","pos","Предсказывается под'ем.","dummy","dummy",0.9).

imp("f","n","Покупайте ценные бумаги.","pos","Price_of_silver_per_ounce < 6.50","dummy","dummy",0.75).

imp("a","n","Покупайте землю.","pos","В районе значительный прирост населения.","pos","Предсказывается кризис.",0.8). imp("a","n","Покупайте различные акции.","pos","Курс доллара сильно упал по отношению к другим валютам.","pos","Падение курса доллара продолжится.",0.5).

27

imp("a","r","Покупайте различные акции.","pos","Предсказывается кризис.","pos","Знаете ли Вы акции, которые идут вверх.",0.8). imp("o","r","Придержите векселя и ценные бумаги.","pos","Предсказывается фаза падения.","pos","Предсказывается под'ем.",0.8). imp("o","r","Придержите землю и различные акции.","pos","Предсказывается фаза под'ема.","pos","Предсказывается кризис.",0.8).

hypotesis_node("Покупайте векселя."). hypotesis_node("Покупайте ценные бумаги."). hypotesis_node("Покупайте различные акции."). hypotesis_node("Покупайте землю."). hypotesis_node("Придержите векселя и ценные бумаги."). hypotesis_node("Придержите землю и различные акции.").

terminal_node("Краткосрочные процентные ставки недавно возросли.").

terminal_node("Цены возрастают уже несколько месяцев."). terminal_node("Общественное мнение в основном положительно."). terminal_node("Значение коэффициента IPI больше единицы."). terminal_node("Значение коэффициента IPI падает уже три месяца."). terminal_node("Значение коэффициента GNP уменьшается уже два квартала.").

terminal_node("Деловая активность снизилась."). terminal_node("Общественное мнение в основном отрицательно."). terminal_node("Процентные ставки падают уже несколько месяцев."). terminal_node("Уменьшение спроса на ссуду.").

terminal_node("Это год перед выборами президента."). terminal_node("Это год президентских выборов."). terminal_node("Благоприятны краткосрочные вложения."). terminal_node("Значение коэффициента IPI возрастает."). terminal_node("Краткосрочные процентные ставки выше долгосрочных.").

terminal_node("Повышение спроса на ссуду."). terminal_node("Неэффективность краткосрочных вложений."). terminal_node("Стабилизация процентных ставок после колебаний."). terminal_node("Yearly_growth_in_M2-Yearly_growth_in_CPI > 4"). terminal_node("Prime_rate-Short_term_CD_rate > 2.25"). terminal_node("Price_of_silver_per_ounce < 6.50"). terminal_node("В районе значительный прирост населения."). terminal_node("Знаете ли Вы акции, которые идут вверх."). terminal_node("Курс доллара сильно упал по отношению к другим валютам.").

terminal_node("Падение курса доллара продолжится."). terminal_node("Знаете ли Вы акции, которые идут вверх.",0.8).

В этой базе знаний содержится множество технических деталей, которые не важны в ЭС, но помогают понять, как она работает. В большинстве импликаций речь идет о предсказании фазы делового цикла на ближайшее будущее. Различные финансовые показатели, используемые в ЭС, публикуются в газетах и официальных документах министерства торговли и федеральной резервной системы США.

28

В частности:

IPI – отношение индекса промышленного производства в текущем году к индексу прошлого года;

GNP – совокупный национальный продукт, полученный путем оценивания всех произведенных товаров и услуг в США за год;

М2 – количество денег в обращении, являющееся мерой материальных затрат в экономике;

CPI – индекс потребительских цен, совокупный показатель инфляции;

краткосрочный процент CD – процент по ссуде, которую дают корпорации банкам на срок три месяца;

учетная ставка – процентная ставка банков для ссуды первоклассным заемщикам.

Список литературы

1.Марселлус Д. Программирование экспертных систем на Турбо Прологе: Пер. с англ./ Предисл. С.В.Трубицына. – М.: Финансы и статистика, 1994.

2.Уотермен Д. Руководство по экспертным системам. – М.: Мир, 1989.

3.Джексон П. Введение в экспертные системы. – М: Издательский дом “Вильямс”, 2001