ИИСС. Практикум решения задач по курсу Основы искусственного интеллекта
Скачать 0.73 Mb.
|
ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫДоработайте проект, создав новый пункт меню 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) ЕСЛИ это отряд карпообразные И у рыбы плавники с розовыми перьями TО это плотва 3) ЕСЛИ спинной плавник узкий И у рыбы желто-золотистый окрас И это отряд карпообразные TО это лещ 4) ЕСЛИ у рыбы нет зубов И одиночный спинной лучевой плавник И это костная рыба И это пресноводная рыба TО это отряд карпообразные 5) ЕСЛИ у рыбы есть костный скелет ИЛИ у рыбы есть жаберные крышки TО это костная рыба 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) ЕСЛИ у рыбы есть электрические органы И это отряд скаты TО это электрический скат 2) ЕСЛИ у рыбы на хвосте ядовитый шип И это отряд скаты TО это скат-хвостокол 3) ЕСЛИ у рыбы серо-коричневый окрас И у рыбы коническая морда И это отряд акулы TО это гиганская акула 4) ЕСЛИ это отряд акулы И рыба нападает на людей И у рыбы молотообразная морда TО это рыба молот 5) ЕСЛИ у рыбы нет хвостового плавника И у рыбы тонкий длинный хвост И это хрящевая рыба И это морская рыба TО это отряд скаты 6) ЕСЛИ это морская рыба И это хрящевая рыба И плавники не гибкие И хвост ассиметричный TО это отряд акулы 7) ЕСЛИ у рыбы нет плавательного пузыря ИЛИ у рыбы есть хрящевый скелет ТО это хрящевая рыба 8) ЕСЛИ рыба плавает в морях ТО это морская рыба 3. Протестируйте полученную экспертную систему. Литература Адаменко А., Кучуков А. Логическое программирование и Visual Prolog.- СПб, 2003 Братко И. Программирование на языке ПРОЛОГ для искусственного интеллекта.- М., 1990. Ин Ц., Соломон Д. Использование Турбо-Пролога. -М., 1993. Клоксин У., Меллиш К. Программирование на языке ПРОЛОГ. -М., 1991. Макаллистер Дж. Искусственный интеллект и Пролог на микроЭВМ.- М., 1990. Янсон А. Турбо-Пролог в сжатом изложении. -М.,1990. |