Главная страница

ИИСС. Практикум решения задач по курсу Основы искусственного интеллекта


Скачать 0.73 Mb.
НазваниеПрактикум решения задач по курсу Основы искусственного интеллекта
Дата17.11.2022
Размер0.73 Mb.
Формат файлаdoc
Имя файлаmetod_VP.doc
ТипПрактикум
#795277
страница8 из 8
1   2   3   4   5   6   7   8

ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ


Доработайте проект, создав новый пункт меню Summa, при выборе которого появляется новое окно для ввода двух чисел и вычисления их суммы.

2.3 Использование элемента ListBox

ListBox (список)- это элемент управления, содержащий набор пунктов, которые может выбрать пользователь. В VPI есть несколько предикатов для работы со списками:

    • lbox_Add (Window, Index, Str) добавляет новую строку Str в список в позицию с индексом Index. Если Index равен -1, то строка добавляется в конец списка. Нумерация элементов списка начинается с 0, т.е. первый элемент списка имеет индекс 0, второй -1 и т.д.

    • lbox_Clear (Window) удаляет все элементы списка

    • lbox_Delete (Window, Index) удаляет элемент с указанным индексом

    • lbox_GetItem (Window, Index) возвращает элемент списка с указанным индексом

    • Integer=lbox_GetSelIndex(Window) возвращает индекс выбранного элемента. Предикат завершится неуспешно, если никакой элемент в списке не выбран

    • lbox_IsSel(Window, Index) завершается успешно или неспешно в зависимости от того, является ли текущим заданный элемент в списке


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

Создать проект, содержащий элементы ListBox (список), Edit Control (поле ввода) для ввода новых данных, Push Button (кнопки) для добавления нового элемента в список и удаления выделенного элемента.
Решение

1. Создайте новый проект.

2. Добавьте в главное меню новый пункт Spisok .

3. Создайте новое окно. Для этого в окне проекта нажмите кнопку Window на левой панели инструментов, а затем – кнопку New справа. Откроется окно Window Attributes. Введите имя создаваемого окна Spisok и нажмите ОК.

4. Разместите на макете появившегося нового окна следующие компоненты: Edit Control, Push Button, ListBox (рис.26).


Push Button

Edit Control

ListBox


рис.26. Созданное окно Spisok

Задайте имена-константы для размещенных элементов, например для Edit Control - idc_edit, для ListBox - id_list_box, для кнопки ADD - idc_add, для кнопки DELETE - idc_delete

5. Сгенерируйте стандартный код Visual Prolog для нового окна. Для этого в окне проекта нажмите кнопку Code Expert, когда выбрано окно Spisok. Откроется окно Dialog and Window Expert. Выберите исходный модуль spisok.pro и нажмите кнопку Default Code.

6. Запрограммируйте выбор пункта меню Spisok для вызова окна Spisok. Для этого в списке окон выберите Task Window, пункт Menu в списке Event Type и выделите строку id_spisok (имя пункта меню) в списке Event or Item. Нажмите кнопку Add Clause, чтобы сгенерировать Пролог-предложение для события. Название кнопки изменится на Edit Clause, когда код для события будет создан. Нажмите кнопку Edit Clause. Откроется окно редактора для файла Spisok.pro, в который добавлено предложение:

%BEGIN Task Window, id_spisok

task_win_eh(_Win,e_Menu(id_spisok,_ShiftCtlAlt),0):-!,

!.

%END Task Window, id_spisok

Допишите команду для открытия окна Spisok: win_spisok_Create(_Win). В результате должно получиться:

%BEGIN Task Window, id_spisok

task_win_eh(_Win,e_Menu(id_spisok,_ShiftCtlAlt),0):-!,

win_spisok_Create(_Win),

!.

%END Task Window, id_spisok

7. Запрограммируйте нажатие кнопки ADD в окне Spisok для добавления нового элемента в список. Для этого вызовите окно Dialog and Window Expert (кнопка Code Expert) и в списке окон выберите Spisok. Выберите пункт Control в списке Event Type и выделите строку pb: idc_add(имя кнопки ADD). Нажмите кнопку Add Clause, а затем Edit Clause(рис.26).



рис.26. Созданное окно Spisok

Откроется окно редактора для файла Spisok.pro, в который добавлено предложение:

%BEGIN spisok, idc_add _CtlInfo

win_spisok_eh(_Win,e_Control(idc_add,_CtrlType,_CtrlWin,

_CtlInfo),0):-!,

!.

%END spisok, idc_add _CtlInfo

Допишите необходимые команды. В результате должно получиться:

%BEGIN spisok, idc_add _CtlInfo

win_spisok_eh(_Win,e_Control(idc_add,_CtrlType,_CtrlWin,

_CtlInfo),0):-!,

LBOXWIN = win_GetCtlHandle(_Win,id_list_box),

E_WINDOW = win_GetCtlHandle(_Win,idc_edit),

EDIT_STRING= win_GetText(E_WINDOW),

EDIT_STRING<>"",

lbox_Add(LBOXWIN,-1,EDIT_STRING),

!.

%END spisok, idc_add _CtlInfo
8. Аналогично запрограммируйте нажатие кнопки DELETE в окне Spisok для удаления выделенного элемента списка.

%BEGIN spisok, idc_delete _CtlInfo

win_spisok_eh(_Win,e_Control(idc_delete,_CtrlType,_

CtrlWin, _CtlInfo),0):-!,

LBOXWIN = win_GetCtlHandle(_Win,id_list_box),

Index = lbox_GetSelIndex(LBOXWIN),

lbox_Delete(LBOXWIN,Index),

!.

%END spisok, idc_delete _CtlInfo
9. Запустите проект на исполнение и протестируйте его.

ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ


Доработайте проект проект следующим образом:

1) добавьте кнопку CLEAR, при нажатии на которую удаляется все содержимое списка (используйте предикат lbox_Clear);

2) добавьте компонент Static Text, который должен отображать выделенный элемент списка.

3 Создание экспертных систем средствами ПРОЛОГа

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

Построим небольшую экспертную систему, которая будет определять одну из нескольких рыб по признакам, указанным пользователем. Система будет задавать вопросы и строить логические выводы на основе полученных ответов.

Типичный диалог экспертной системы с пользователем может выглядеть следующим образом (рис.27):



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

  • базу знаний;

  • механизм вывода;

  • пользовательский интерфейс.

Разработку любой ЭС следует начать с исследования предметной области. Пусть на основе бесед с экспертом были получены следующие эмпирические правила:

1) ЕСЛИ

это отряд карпообразные и

И

у рыбы желто-золотистый окрас

И

губы с 4 усиками

ТО

это сазан

2) ЕСЛИ

это отряд карпообразные

И

у рыбы плавники с розовыми перьями



это плотва

3) ЕСЛИ

спинной плавник узкий

И

у рыбы желто-золотистый окрас

И

это отряд карпообразные



это лещ

4) ЕСЛИ

у рыбы нет зубов

И

одиночный спинной лучевой плавник

И

это костная рыба

И

это пресноводная рыба



это отряд карпообразные

5) ЕСЛИ

у рыбы есть костный скелет

ИЛИ

у рыбы есть жаберные крышки



это костная рыба

6) ЕСЛИ

рыба плавает в озерах

ИЛИ

рыба плавает в реках

ТО

это пресноводная рыба

Для создания базы знаний используем предикаты:

fish(symbol)

otrajd(symbol)

vid(symbol)

priznak(symbol)

Базу знаний будут составлять следующие правила:

fish("это сазан"):-

otrajd("отряд карпообразные"),

priznak("губы с 4 усиками").

fish("это плотва"):-

otrajd("отряд карпообразные"),

priznak("плавники с розовыми перьями").

fish("это лещ"):-

otrajd("отряд карпообразные"),

priznak("у рыбы желто-золотистый окрас"),

priznak("у рыбы спинной плавник узкий").

Необходимо предусмотреть, что искомой рыбы в базе знаний нет:

fish("Данной рыбы в базе знаний не обнаружено").

otrajd("отряд карпообразные"):-

vid("пресноводная рыба"),

vid("костная рыба"),

priznak("одиночный спинной лучевой плавник"),

priznak("у рыбы нет зубов").

vid("костная рыба"):-

priznak("у рыбы есть жаберные крышки");

priznak("у рыбы есть костный скелет").

vid("пресноводная рыба"):-

priznak("рыба плавает в реках или озерах").

Для хранения информации, полученной от пользователя, используются предикаты yes и no, составляющие внутреннюю базу фактов. Предикат yes служит для хранения фактов, соответствующих положительному ответу, а предикат no – для хранения отрицательных ответов. Т.е. предикат yes утверждает наличие какого-либо признака у рыбы, а no – отсутствие указанного признака. Эти предикаты объявляются в разделе внутренней базы фактов:

global facts

yes (symbol)

no (symbol)

Добавить новые факты во внутреннюю базу можно с помощью правила add_to_database, состоящего из двух частей. Первая часть добавляет факты, соответствующие положительному ответу (с клавиатуры вводится ‘y’). Вторая часть правила добавляет факты, указывающие на отсутствие данного признака у рыбы.

add_to_database (Y,'y') :- assertz (yes (Y)).

add_to_database (Y,'n') :- assertz (no (Y)),fail.

Необходимо предусмотреть очистку внутренней базы фактов. Для этого создадим правило:

clear_from_database :- retract(yes(_)),fail.

clear_from_database :- retract(no(_)),fail.

Для проверки наличия у рыбы определенного признака создадим правило priznak (Y):

priznak (Y) :- yes (Y),!.

priznak (Y) :- not(no (Y)),

question (Y).

Формулировка вопроса, ввод ответа и сохранение соответствующего правила осуществляется с помощью правил:

answer :- fish(X),!,nl,

save("BF1.dbf"),

write (" Ответ: ",X,"."),nl.

question(Y) :-

write ("Вoпрос: ",Y,"?(y/n) "),

otvet(X),

write(X),nl,

add_to_database (Y,X).

otvet(C):-readchar(C).

И, наконец, правило begin, запускающее сеанс консультации:

begin :- write ("Ответьте на вопросы :"),nl,nl,

answer,

clear_from_database,

nl,nl,nl,nl,

exit.

Полный листинг программы выглядит следующим образом:

GLOBAL FACTS

yes (symbol)

no (symbol)

PREDICATES

fish(symbol)

otrajd(symbol)

vid(symbol)

begin

answer

question(symbol)

add_to_database(symbol,char)

otvet(char)

clear_from_database

priznak(symbol)

GOAL

begin.

CLAUSES

begin :-

write ("Ответьте на вопросы :"),nl,nl,

answer,

clear_from_database,

nl,nl,nl,nl,

exit.

answer :-

fish(X),!,nl,

save("BF1.dbf"),

write (" Ответ: ",X,"."),nl.

question(Y) :-

write ("Вoпрос: ",Y,"? "),

otvet(X),

write(X),nl,

add_to_database (Y,X).

otvet(C):-

readchar(C).

priznak (Y) :-

yes (Y),!.

priznak (Y) :-

not( no (Y)),

question (Y).

add_to_database (Y,'y') :-

assertz (yes (Y)).

add_to_database (Y,'n') :-

assertz (no (Y)),fail.

clear_from_database :- retract (yes(_)),fail.

clear_from_database :- retract (no(_)),fail.

fish("это сазан"):-

otrajd("отряд карпообразные"),

priznak("губы с 4 усиками").

fish("это плотва"):-

otrajd("отряд карпообразные"),

priznak("плавники с розовыми перьями").

fish("это лещ"):-

otrajd("отряд карпообразные"),

priznak("у рыбы желто-золотистый окрас"),

priznak("у рыбы спинной плавник узкий").

fish("Данной рыбы в базе знаний не обнаружено").

otrajd("отряд карпообразные"):-

vid("пресноводная рыба"),

vid("костная рыба"),

priznak("одиночный спинной лучевой плавник"),

priznak("у рыбы нет зубов").

vid("костная рыба"):-

priznak("у рыбы есть жаберные крышки");

priznak("у рыбы есть костный скелет").

vid("пресноводная рыба"):-

priznak(«рыба плавает в реках или озерах»).

ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ


1. Реализуйте данную программу в среде Visual Prolog и протестируйте ее.

2. Расширьте базу знаний экспертной системы, добавив следующие правила:

1) ЕСЛИ

у рыбы есть электрические органы

И

это отряд скаты



это электрический скат

2) ЕСЛИ

у рыбы на хвосте ядовитый шип

И

это отряд скаты



это скат-хвостокол

3) ЕСЛИ

у рыбы серо-коричневый окрас

И

у рыбы коническая морда

И

это отряд акулы



это гиганская акула

4) ЕСЛИ

это отряд акулы

И

рыба нападает на людей

И

у рыбы молотообразная морда



это рыба молот

5) ЕСЛИ

у рыбы нет хвостового плавника

И

у рыбы тонкий длинный хвост

И

это хрящевая рыба

И

это морская рыба



это отряд скаты

6) ЕСЛИ

это морская рыба

И

это хрящевая рыба

И

плавники не гибкие

И

хвост ассиметричный



это отряд акулы

7) ЕСЛИ

у рыбы нет плавательного пузыря

ИЛИ

у рыбы есть хрящевый скелет

ТО

это хрящевая рыба

8) ЕСЛИ

рыба плавает в морях

ТО

это морская рыба

3. Протестируйте полученную экспертную систему.

Литература

  1. Адаменко А., Кучуков А. Логическое программирование и Visual Prolog.- СПб, 2003

  2. Братко И. Программирование на языке ПРОЛОГ для искусственного интеллекта.- М., 1990.

  3. Ин Ц., Соломон Д. Использование Турбо-Пролога. -М., 1993.

  4. Клоксин У., Меллиш К. Программирование на языке ПРОЛОГ. -М., 1991.

  5. Макаллистер Дж. Искусственный интеллект и Пролог на микроЭВМ.- М., 1990.

  6. Янсон А. Турбо-Пролог в сжатом изложении. -М.,1990.




1   2   3   4   5   6   7   8


написать администратору сайта