КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Лабораторная работа №5
“ЭКСПЕРТНАЯ СИСТЕМА НА БАЗЕ ФРЕЙМОВ”
Цель. Демонстрация реализации на Прологе экспертной системы на основе фреймов.
Теория. Экспертная система на основе фреймов представляет собой набор окон. Окно содержит результирующее поле и поля входных данных, на основе которых определяется результирующее значение. Рассмотрим пример такого окна:
Чтобы определить скорость автомобиля, необходимо создать это окно и ввести данные по состоянию дороги и состоянию автомобиля. Эти значения система будет запрашивать у пользователя.
Создадим заготовку программы.
database - mydb avto(char) % предикаты БД road(char)
predicates
nondeterm expert nondeterm obrab(char)
clauses
expert:- makewindow(1,55,58,"win_velocity",0,0,10,50), write("SPEED"), nl, write("1.State of avto"), nl, write("2.State of road"), nl, write("3.END"), nl, write("Your choice (1/2/3)->"),
readchar(C), obrab(C).
obrab('1'):-makewindow(2,55,58,"win_avto",0,0,10,50),
write("AVTO-STATE"), nl, write("1.Bad"), nl, write("2.Middle"), nl, write("3.Good"), nl, write("Your choice (1/2/3/4)->"),
readchar(C), retractall(_,mydb), assert(avto(C),mydb), removewindow, shiftwindow(1).
obrab('2'):-!. obrab('3'):-!,fail.
goal
expert.
Фрагмент expert:- makewindow(1,55,58,"win_velocity",0,0,10,50), write("SPEED"), nl, write("1.State of avto"), nl, write("2.State of road"), nl, write("3.END"), nl, write("Your choice (1/2/3)->"),
readchar(C), obrab(C).
является главным. Его работу иллюстрирует рисунок:
Пользователь должен сделать выбор – ввести номер опции. При вводе 1 или 2 отображается новое окно, например:
Выбор варианта определяется предикатом obrab(C). Переменная С получает значение после ввода номера опции человеком. Рассмотрим реализацию obrab(‘1’):
obrab('1'):-makewindow(2,55,58,"win_avto",0,0,10,50),
write("AVTO-STATE"), nl, write("1.Bad"), nl, write("2.Middle"), nl, write("3.Good"), nl, write("Your choice (1/2/3/4)->"), readchar(C), retractall(_,mydb), assert(avto(C),mydb), removewindow, shiftwindow(1), !.
Пользователю предлагается выбрать вариант состояние машины – BAD, MIDDLE, GOOD. Пользователь вводит номер опции (1, 2, 3) соответственно выбираемому варианту. Произведенный им выбор записывается в ячейку базы данных: assert(avto(C),mydb).
Тот вариант программы, который мы привели, работает плохо. Окна сразу сворачиваются и никакого анализа не производится. Поэтому добьемся того, чтобы окно не пропадало. Для этого мы вставили предикат repeat и изменили программу следующим образом
database - mydb avto(char) road(char)
predicates
nondeterm expert nondeterm obrab(char) nondeterm repeat
clauses
expert:- makewindow(1,55,58,"win_velocity",0,0,10,50), repeat, clearwindow, write("SPEED"), nl, write("1.State of avto"), nl, write("2.State of road"), nl, write("3.END"), nl, write("Your choice (1/2/3)->"),
readchar(C), obrab(C).
obrab('1'):-makewindow(2,55,58,"win_avto",0,0,10,50),
write("AVTO-STATE"), nl, write("1.Bad"), nl, write("2.Middle"), nl, write("3.Good"), nl, write("Your choice (1/2/3/4)->"),
readchar(C), retractall(avto(_),mydb), assert(avto(C),mydb), removewindow, shiftwindow(1),
!, fail.
obrab('2'):-!,fail. obrab('3'):-!.
repeat. repeat:-repeat.
goal
expert.
Сравните исходный вариант и полученный. Посмотрите, в чем разница в их работе. Теперь мы вставим в obrab('2') «заглушку» (а Вам придется ее детализировать наподобие obrab('1')):
obrab('2'):- retractall(road(_),mydb), assert(road(‘2’),mydb), !, fail.
Данная заглушка просто вставляет в базу значение Состояние Дороги, равное 2 (MIDDLE).
Теперь нам нужно произвести оценку скорости, поскольку вся информация введена. Для этого мы модифицируем пункт END основного окна. Для выбора скорости будем использовать следующий фрагмент:
obrab('3'):-!, road(R), avto(A), ocenka(R,E1), ocenka(A,E2), ALPHA=0.8*E1+0.2*E2, VELOCITY=90*ALPHA, nl, write("RECOMMENDED SPEED IS:",VELOCITY), nl, write("Exit? (y/n)"), readchar(W), vyxod(W).
ocenka('1',0.2). ocenka('2',0.5). ocenka('3',0.9).
vyxod('y'):-!.
Теперь программа срабатывает так:
Вся программа к настоящему моменту имеет такой вид:
database - mydb avto(char) road(char)
predicates
nondeterm expert nondeterm obrab(char) nondeterm repeat nondeterm ocenka(char,real) nondeterm vyxod(char)
clauses
expert:- makewindow(1,55,58,"win_velocity",0,0,10,50), repeat, clearwindow, write("SPEED"), nl, write("1.State of avto"), nl, write("2.State of road"), nl, write("3.END"), nl, write("Your choice (1/2/3)->"),
readchar(C), obrab(C).
obrab('1'):-makewindow(2,55,58,"win_avto",0,0,10,50),
write("AVTO-STATE"), nl, write("1.Bad"), nl, write("2.Middle"), nl, write("3.Good"), nl, write("Your choice (1/2/3/4)->"),
readchar(C), retractall(_,mydb), assert(avto(C),mydb), removewindow, shiftwindow(1),
!,fail.
obrab('2'):- retractall(road(_),mydb), assert(road('2'),mydb), !, fail.
obrab('3'):-!, road(R), avto(A), ocenka(R,E1), ocenka(A,E2), ALPHA=0.8*E1+0.2*E2, VELOCITY=90*ALPHA, nl, write("RECOMMENDED SPEED IS:",VELOCITY), nl, write("Exit? (y/n)"), readchar(W), vyxod(W).
ocenka('1',0.2). ocenka('2',0.5). ocenka('3',0.9).
vyxod('y'):-!.
repeat. repeat:-repeat.
goal
expert.
Предикат ocenka производит оценку варианта. И для автомобиля и для дороги оценки получают одинаково.
Итак, Вам представлена заготовка программы. В задании формулируются задачи по ее доводке.
ЗАДАНИЕ НА ВЫПОЛНЕНИЕ.
Дата добавления: 2015-06-27; Просмотров: 283; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |