Студопедия

КАТЕГОРИИ:


Архитектура-(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 производит оценку варианта. И для автомобиля и для дороги оценки получают одинаково.

 

Итак, Вам представлена заготовка программы. В задании формулируются задачи по ее доводке.

 

 

ЗАДАНИЕ НА ВЫПОЛНЕНИЕ.

 

  1. Доработать опцию obrab('2'), чтобы создавалось окно по типу obrab('1').
  2. Усложнить предикат ocenka.
  3. Изменить вычисление ALPHA (весовые коэффициенты вводить с клавиатуры).
  4. Добавить новый критерий – СОСТОЯНИЕ ВОДИТЕЛЯ и изменить программу сообразно этому.
<== предыдущая лекция | следующая лекция ==>
Лабораторная работа №4. Работа с окнами. | CALL Вызов процедуры
Поделиться с друзьями:


Дата добавления: 2015-06-27; Просмотров: 261; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.