Лабораторная работа №2
Создание продукционной модели экспертной системы в интегрированной среде ИНТЕР-ЭКСПЕРТ
Цель работы – создание экспертных систем в среде ИНТЕР-ЭКСПЕРТ.
Краткое теоретическое введение
Построение экспертных систем в среде ИНТЕР-ЭКСПЕРТ
Структура набора правил
Набор правил может иметь пять разделов (максимальное количество семь), которые появляются в любом порядке в пределах файла. Окончание набора обозначается END: label. За каждым именем раздела и каждым именем предложения следует двоеточие:
GOAL: раздел цели
INITIAL: раздел инициализации
RULE: раздел правила
VARIABLE: раздел переменной
COMPLETION: раздел завершения
Раздел цели
Раздел цели начинается со слова GOAL
GOAL: gvar
Переменная gvar – безусловная цель набора правил. Если при запросе консультации (CONSULT TO SEEK) переменная цели не специфицируется, то цель консультации gvar. Если же при таком запросе целевая переменная обозначена, то безусловная цель gvar игнорируется. Например:
GOAL: x
GOAL: AB52
Инициализация
Последовательность инициализации представляет собой серию из одной и более команд, которые ИНТЕР-ЭКСПЕРТ выполняет при консультации с набором правил. Чтобы пробные консультации можно было повторить в ходе отладки, необходимо присвоить значения UNKNOWN изменившимся переменным в последовательности инициализации.
Раздел инициализации начинается словом INITIAL и состоит из серии, включающей в себя один и более операторов ИНТЕР-ЭКСПЕРТ:
INITIAL:
statement
Каждый оператор (statement) – действительная команда ИНТЕР-ЭКСПЕРТ. Если командный оператор не умещается на одной строке, закончите эту строку обратной косой чертой и продолжите команду на следующей строке.
INITAL:
INPUT REG WITH "Введите имя района:"
TEST REG
CASE "Восток": FACTOR = 1.073: BREAK;
CASE "Запад": FACTOR = 1.06: BREAK;
CASE "Юг": FACTOR = 1.113: BREAK;
OTHERWISE: FACTOR = 1.05; ENDTEST
SELECT * FROM SALESTAB WHERE REG IN ["Восток", \
"Запад", "Юг"] ORDER BY DESCENDING SALES
FACTOR = FACTOR * #AVER (3)
E.RIGR = "A"
Прeдлoжения завершения
Последовательность завершения – серия, состоящая из одной или более команд ИНТЕР-ЭКСПЕРТ, которые система ИНТЕР-ЭКСПЕРТ выполнит, как только будет завершена вся аргументация набора правил.
DO: statement
Statement
Разделы правил
Набор правил – группа из одного или нескольких последовательных разделов правил. В каждом разделе определяется одно правило. Раздел правила начинается со слова RULE и имеет несколько предложений, которые появляются в любом порядке в рамках раздела правила:
RULE: rname
COMMENT: ctext
IF: premise
TNEN: tstatement
REASON: rtext
Метка RULE содержит имя правила, длина которого не должна превышать восемь символов, первый – буквенный. Запрещается использовать ключевое слово ИНТЕР-ЭКСПЕРТа в качестве имени правила.
Посылка предложения IF представляет собой любое действительное логическое выражение. В ходе консультации ИНТЕР-ЭКСПЕРТ выполняет действия, содержащиеся в заключении правила, в том случае, если посылка окажется TRUE (а не FALSE или UNKNOWN).
Предложение THEN специфицирует действия, которые предпринимаются, если посылка правила – TRUE. Каждый оператор в последовательности действий – любая действительная команда ИНТЕР-ЭКСПЕРТ.
Предложение REASON содержит текст пояснений, отображающийся в ходе или после консультации. Например:
RULE: HISALES
IF: SALES> QUOTA*1.2
THEN: PFACTOR = SALES/QUOTA – 2
REASON: Когда объем продаж более чем на двадцать процентов превосходит квoту (план), избыточный процент следует учитывать как коэффициент при определении новой квоты.
Описание переменных
Раздел переменной может иметь до семи произвольных предложений, например:
VARIABLE: wvar
LABEL: ltext
FIND: statement,
где wvar – имя переменной, ltext – метка, содержащая до 48 символов текста, который ИНТЕР-ЭКСПЕРТ отобразит, ссылаясь к переменной при объяснении своей аргументации. Если метки вообще не существует, то используется имя переменной.
FIND – последовательность нахождения представляет собой серию из одной или более команд, которые выполняет ИНТЕР-ЭКСПЕРТ, чтобы найти значение переменной, если она типа UNKNOWN. Например, это может быть команда INPUT, подсказывающая ввести значение переменной, или она может быть расширенным процедурным файлом, определяющим это значение.
Koмпиляция набора правил
Компиляция набора правил осуществляется с помощью пункта меню «Компиляция» либо в командном режиме (Изменение среды>Командный режим) посредством команды COMPILE ruleset, где ruleset – имя набора правил, находящегося в файле ruleset.RSS. ИНТЕР-ЭКСПЕРТ компилирует указанный набор правил и сохраняет результат в файле ruleset.RSC. Выход из командного режима осуществляется командой BYE.
Пример программы
/* INVESTOR.RSS */
GOAL: advice
INITIAL:
macro skip output "" /* Определение макрокоманды SKIP*/
e.tryp = "e"
e.rigr = "m"
e.lstr = 80 /* Maксимальная длина строки 80 */
e.deci = 0 /* Нет цифр после десятичной запятой*/
e.lnum = 8 /* Длина числа */
savperdep = 5000
incperdep = 4000
basincome = 15000
advice = unknown
goodsave = unknown
goodincome = unknown
income = unknown
savings = unknown
steady = unknown
needincome = unknown
dependents = unknown
newcash = unknown
clear
at 2,27 output "КАПИТАЛОВЛОЖЕНИЯ"
skip
skip
input newcash num with "Какую сумму наличных денег Вы хотели бы вложить?"
DO: /* Этот раздел выполняется после обработки правил*/
skip
skip
output "На основе данной информации:"
skip
test advice
case "акции":
output " Вам следует вложить всю сумму в акции."
break
case "сбережения":
output "Вам следует поместить всю сумму в банк."
break
case "компромисс":
tosave = min(newcash, (savperdep * dependents) - savings)
tostock = max(0, newcash - tosave)
output " Вам следует поместить в сбережения: ", \
tosave using "ff,fff,fff","."
if tostock > 0 then
output " И вложить ",tostock using "ff,fff,fff",\
" в акции."
endif
break
endtest
e.deci = 2
e.lnum = 14
skip
skip
RULE: R1
IF: goodincome and goodsave
THEN: advice = "акции"
NEEDS: goodincome goodsave
REASON: Вкладывать в акции, если клиент
надежный в финансовом отношении.
RULE: R2
IF: not goodincome
THEN: advice = "сбережения"
NEEDS: goodincome
REASON: Не вкладывайте в акции, если Ваш доход в
настоящее время неустойчив.
RULE: R3
IF: not goodsave and goodincome
THEN: advice = "компромисс"
REASON: Если сбережения небольшие, тогда они должны
быть увеличены до того, как их вкладывать.
RULE: R4
IF: not steady
THEN: goodincome = false
REASON: Для хорошего дохода необходима постоянная работа.
RULE: R5
IF: not (income > needincome)
THEN: goodincome = false
REASON: Доход не зависит от Вас и иждивенцев.
RULE: R6
IF: steady and (income > needincome)
THEN: goodincome = true
REASON: Чтобы доход был хорошим, клиент должен иметь
постоянную работу.
RULE: R7
IF: known("income") and known("dependents")
THEN: needincome = basincome + (dependents * incperdep)
REASON: Необходимый доход - это основной доход, который Вам необходим, плюс общий доход Ваших иждивенцев.
RULE: R8
IF: savings > (savperdep * dependents)
THEN: goodsave = true
NEEDS: savings dependents
REASON: Сбережения клиентов должны зависеть от них
самих и иждивенцев.
RULE: R9
IF: savings <= (savperdep * dependents)
THEN: goodsave = false
NEEDS: savings dependents
REASON: Сбережения клиентов не зависят от них самих
и иждивенцев.
/* Определение переменных */
VAR: NEWCASH
LABEL: Сумма наличных денег для вклада
VAR: ADVICE
LABEL: Данный совет
VAR: GOODINCOME
LABEL: Текущий доход - хороший
VAR: GOODSAVE
LABEL: Текущие сбережения - хорошие
VAR: NEEDINCOME
LABEL: Необходимая сумма дохода
VAR: INCOME
FIND: skip
input income num with \
" Какой Ваш годовой доход семьи? "
LABEL: Текущий доход
VAR: SAVINGS
FIND: skip
input savings num with \
" Сколько у Вас сбережений? "
LABEL: Текущие сбережения
VAR: STEADY
FIND: skip
input steady str using "u" with \
"Можете ли Вы ожидать стабильный доход на следующий год ? (y/n) "
steady = (steady = "Y")
LABEL: Надежный доход
VAR: DEPENDENTS
LABEL: Число иждивенцев
FIND: skip
input dependents num using "dd" with \
" Сколько у Вас иждивенцев? "
END: